代码之家  ›  专栏  ›  技术社区  ›  Hussain Akbar

如何用sed删除空的重复行?

  •  -1
  • Hussain Akbar  · 技术社区  · 6 年前

    我有一个在RH5上运行的遗留程序,它以文本文件的形式生成输出,然后使用lp/lpd打印输出。

    要求删除重复的空行。i、 e.如果有两行或多行空行,则应替换为一行空行。

    但是,空行有不同的空格字符:

    ......Heading.......
    ....................
    ...Name:.John.Doe...
    ...PIN:.......123...
    ....................   <--- This should be replaced with a single blank line
    ....................
    ...Date:.02/03/2019.
    
    

    如果删除重复的空格,将影响格式设置。所以,应该删除所有空格的行。

    1 回复  |  直到 6 年前
        1
  •  3
  •   KamilCuk    6 年前

    一些事情:

    sed 'N;/^ *\n *$/!P;D'
    

    小解释:

    • N -向图案空间添加下一行
    • /^ *\n *$/ -我们在模式空间中有两行,如果它们是空的,就只有带空格的换行符。所以从头匹配 ^ 在模式上, * 只匹配一个换行符,一个换行符 \n * 零个或更多空间直到模式空间结束 $
    • !
    • P -打印图案空间直到换行
    • D

    测试对象:

    $ printf "   %s   \n" "A" "" "" "" "B" "C" "D" "" "" "" "" "E" | sed 'N;/^ *\n *$/!P;D'
       A   
    
       B   
       C   
       D   
    
       E   
    

    我看到最后一行没有打印我的GNU sed with --posix $q 最后,我猜是什么 N个

    sed --posix '$q;N;/^ *\n *$/!P;D;'
    
        2
  •  -2
  •   choroba    6 年前

    Perl去营救!

    perl -ne '$empty = ! /\S/;
              print unless $empty && $previous_empty;
              $previous_empty = $empty;
             ' -- file.txt
    
    • -n 逐行读取文件
    • /\S/
    • ! 表示“不”,即变量 $empty
    • 打印行,除非它是空的,并且前一行也是空的
    • 前一行的空行是通过将当前行的空行保存在不同的变量中来处理的。

    你甚至可以使用 -i.bak 选项以就地更改文件。

    推荐文章