【问题标题】:How to remove empty duplicate lines with sed? [closed]如何使用 sed 删除空的重复行? [关闭]
【发布时间】:2019-11-19 10:32:08
【问题描述】:

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

要求是去掉重复的空行。即如果有 2 个或更多空行,则应将它们替换为单个空行。

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

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

如果我删除重复的空格,则会影响格式。因此,应删除仅包含所有空格的行。

【问题讨论】:

  • 你试过uniq命令吗?
  • 没有。打印输出有他们想要打印的带有破折号的行。 uniq 会删除连续的虚线。
  • @F.Hauri 等人:请告诉我为什么这个问题被标记为你所做的。我不认为它很广泛或有多个问题,但如果我弄错了,请告诉我,以便我可以更正未来的问题。

标签: linux bash sed


【解决方案1】:

一些东西:

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 没有用--posix 打印最后一行,我能够在最后用$q 修复它,我猜N 在posix 和gnu sed 之间有什么不同(它确实不在posix中打印模式空间):

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

【讨论】:

  • 谢谢。我上次使用cat myfile |sed -e 'N;/^ *\n *$/d;P;D' 的尝试很接近,但并不完全在那里。我会使用你的解决方案。
  • 这是因为d 将其全部删除,因此多个空行将不起作用。 N;/^ *\n *$/D;P;D 是我的第一个答案。然后我看到D;P;D 可以缩短为这个!P;D
【解决方案2】:

Perl 来救援!

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

您甚至可以使用-i.bak 选项来更改文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2021-12-13
    • 2013-05-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多