【问题标题】:Get multi-line text in between horizontal delimiter with sed / awk使用 sed / awk 在水平分隔符之间获取多行文本
【发布时间】:2012-07-07 04:58:27
【问题描述】:

我想在水平分隔符之间获取多行文本,并忽略分隔符前后的任何其他内容。

一个例子是:-

Some text here before any delimiter
----------
Line 1
Line 2
Line 3
Line 4
----------
Line 1
Line 2
Line 3
Line 4
----------
Some text here after last delimiter

我想得到

Line 1
Line 2
Line 3
Line 4


Line 1
Line 2
Line 3
Line 4

如何使用 awk / sed 和正则表达式来做到这一点?谢谢。

【问题讨论】:

  • 你的意思肯定不是sed '/^-*$/d'
  • 你能澄清一下“分隔符之前和之后”吗?
  • 删除到第一个分隔符,从最后一个分隔符到末尾,并将中间的任何分隔符变成随机数量的换行符?
  • @RayToal 我已经编辑了我的示例。基本上我在输出文件的开头和结尾都有我不需要的文本。我只需要分隔符之间的输出。谢谢。
  • 我明白了,但这不能在纯面向行的 awk/sed 样式脚本中完成,因为您不知道何时到达 last 分隔符,直到你已经阅读了整个文件。你能把整个文件塞进内存吗?因为如果是这样的话,用 Python 或 Ruby 编写是微不足道的。

标签: sed awk


【解决方案1】:

你可以试试这个。

文件:a.awk:

BEGIN { RS = "-+" } 

{
    if ( NR > 1 && RT != "" )
    {
        print $0      
    }
}

运行:awk -f a.awk 数据文件

【讨论】:

    【解决方案2】:

    如果您可以轻松地将整个文件放入内存中,并且如果可以接受 Perl 而不是 awk 或 sed,则

    perl -0777 -pe 's/\A.*?\n-{10}\n//s;
        s/(.*\n)-{10}\n.*?\Z/\1/s;
        s/\n-{10}\n/\n\n\n/g' file >newfile
    

    这里的主要常见问题解答是-0777 选项(slurp 模式)和/s(点匹配换行符)正则表达式标志。

    【讨论】:

      【解决方案3】:

      这可能对你有用:

      sed '1,/^--*$/d;:a;$!{/\(^\|\n\)--*$/!N;//!ba;s///p};d' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-03
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 2011-12-02
        • 2019-09-17
        相关资源
        最近更新 更多