我找到了一个模拟cat -s
的sed示例,它将用一个空行替换两个或多个空行。
命令在
下面echo -e "\n-------------\nline1\n\nline2\nline3\n\n\nline4\n\n\n\nlast line\n-------------" | sed '1s/^$//p;/./,/^$/!d'
我理解sed部分有两个部分。第一个,'1s/^$//p'
将在第一行发生,并且只会打印出第一行的空白。好的,那部分我明白了。
现在,对于第二部分'/./,/^$/!d'
,如果该行与/./
,任何单个字符或/^$/
空行不匹配,它将删除该行。那几乎涵盖了什么,不是吗?如何在另一个空行与之匹配之后出现空行?
答案 0 :(得分:3)
sed手册说:
追加'!'字符到地址规范的末尾 (在命令信之前)否定了比赛的意义。
因此,sed命令/./,/^$/!d
是“在包含任意字符的行定义的范围内删除不的行,直到并包含一个空行”。所以它将删除不属于这种范围的行。
1 -------------
2 line1
3
4 line2
5 line3
6
7
8 line4
9
10
11
12 last line
13 -------------
14
第一个范围是1-3行。 第二个范围是4-6行。 下一个范围是8-9行。 最后一个范围是12-14行。
第7行和第10-11行不属于任何匹配的范围,因此它们受!
修饰符影响,并且会被删除。
我可以想办法在其他编程语言中做得更清楚,但是如果你只有sed
,那么这是减少多余空行的有效方法。