为什么我不能将两个 [或更多..] 空行 sed 到一个空行?诀窍是什么?
echo -e "hello\n\n\nhello2" | sed 's/^$\n^$/\n/g'
hello
hello2
Run Code Online (Sandbox Code Playgroud)
Cal*_*leb 13
您sed失败的原因是,除非您指定多行运算符,否则它会一次对流进行一行操作。如果您一次只查看一行文本,那么将多个行首^和行尾$运算符串在一起是没有意义的。
折叠多个空行的最简单方法是使用cat. 从手册页:
-s, --squeeze-blank
抑制重复的空输出行
它是这样工作的:
$ echo -e "hello\n\n\nworld" | cat -s
hello
world
Run Code Online (Sandbox Code Playgroud)
如果要完全删除空行而不是压缩它们,请使用grep:
$ echo -e "hello\n\n\nworld" | grep -v '^$'
hello
world
Run Code Online (Sandbox Code Playgroud)
请注意,如果您真的想这样做,sed则必须使用复杂的表达式和操作。这是一个示例(感谢fred)将任意数量的顺序空白折叠为一个空白行:
$ echo -e "hello\n\n\nworld" | sed -re '$!N;/^\n$/!P;D'
hello
world
Run Code Online (Sandbox Code Playgroud)
如果您只cat -s需要折叠多个空白行,您就会明白为什么会更容易!