为什么我不能将两个 [或更多..] 空行发送到一个空行?有什么窍门呢?
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