为什么我不能将两个 [或更多..] 空行发送到一个空行?

为什么我不能将两个 [或更多..] 空行发送到一个空行?

为什么我不能将两个 [或更多..] 空行发送到一个空行?有什么窍门呢?

echo -e "hello\n\n\nhello2" | sed 's/^$\n^$/\n/g'
hello


hello2

答案1

失败的原因sed是,除非您指定多行运算符,否则它一次只能在流上运行一行。如果您一次只查看一行文本,那么多个行首^和行尾运算符像这样串在一起是没有意义的。$

折叠多个空白行的最简单方法是使用cat.从手册页:

-s, --squeeze-blank
抑制重复的空输出行

它的工作原理如下:

$ echo -e "hello\n\n\nworld" | cat -s
hello

world

如果您想完全删除空行而不是压缩它们,请使用grep

$ echo -e "hello\n\n\nworld" | grep -v '^$'
hello
world

请注意,如果您确实想这样做,则sed必须使用复杂的表达式和操作。这是一个例子(感谢弗雷德) 将任意数量的连续空白折叠成单个空白行:

$ echo -e "hello\n\n\nworld" | sed -re '$!N;/^\n$/!P;D'
hello

world

您会明白,cat -s如果您只需要折叠多个空白行,为什么会容易得多!

答案2

另一种用于awk后代的方法可以让您更好地控制,如下所示:

cat file | awk 'BEGIN {sp=0} \
         {if (length($0)==1) {sp=sp+1} \
          if (sp>=1&&length($0)==1) {
          } else {
             for (i=1;i<=((3<sp)?3:sp);i++) {print ""}
             print $0; sp=0}
    }'

这会将任意数量的空格行 ( length($0)==1) 压缩为更少,但不一定为零(本例中为 3 行)。

因此,将保留 1、2 或 3 行空白,但超过 3 行的空白将始终被压缩为 3 行。

答案3

sed -e '/./b' -e :n -e 'N;s/\n$//;tn' infile

相关内容