【问题标题】:Remove blank lines between patterns删除图案之间的空白行
【发布时间】:2013-02-23 17:31:39
【问题描述】:

我希望使用 sed 或 awk 删除文件中的空行(新行、制表符和空格),但前提是这些空行位于两个模式之间。

lorem lorem PATTERN1

\t

PATTERN2 lorem2 lorem2`

我希望下面的结果是两个模式的 2 行的串联。

lorem lorem PATTERN1PATTERN2 lorem2 lorem2

【问题讨论】:

  • sed "/PATTERN1/,/PATTERN2/d" 文件

标签: linux sed awk


【解决方案1】:

这可能对你有用(GNU sed):

sed -r '/PATTERN1/!b;:a;/PATTERN2/bb;$!{N;ba};:b;s/(PATTERN1.*)[ \t\n]+(.*PATTERN2)/\1\2/;tb' file
  • /PATTERN1/!b 只打印该行,除非它包含第一个模式
  • :a;/PATTERN2/bb;$!{N;ba} 将后续行读入模式空间 (PS),直到遇到第二个模式
  • :b;s/(PATTERN1.*)[ \t\n]+(.*PATTERN2)/;tb 替换第一个和第二个模式之间的所有空格、制表符和换行符。

【讨论】:

    【解决方案2】:

    @WilliamPursell 的 perl 脚本的 GNU awk 等效项:

    awk -v RS='\0' '{print gensub(/(PATTERN1).*(PATTERN2)/,"\\1\\2","g")}' file
    

    【讨论】:

      【解决方案3】:

      如果您只想删除包含 PATTERN1 和 PATTERN2 的行之间仅包含空格的行,只需执行以下操作:

      sed '/PATTERN1/,/PATTERN2/{ /^[ \t]*$/d}'
      

      在您提供的示例输出中,您似乎还想消除 PATTERN1 后面的换行符,但不清楚您希望如何处理输入:

      PATTERN1
      non-empty-line
      
      PATTERN2
      

      也不是你想怎么处理

      PATTERN1 non-whitesapce
      PATTERN2
      

      也许需要澄清这个问题。如果你真的只是想消除pattern1pattern2 之间的所有空格,这可能是最简单的:

      perl -0777 -pe 's/(pattern1)\s*(pattern2)/$1$2/g'
      

      【讨论】:

        【解决方案4】:

        @user537723:你可以试试 awk:

        ---改进了之前的帖子,所以它打印在图案之间的一行上---

        awk '/PATTERN1/{ORS=x} /PATTERN2/{ORS=RS} ORS || NF' file
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-09
          • 2023-02-15
          • 1970-01-01
          • 2012-09-25
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          • 2020-03-19
          相关资源
          最近更新 更多