我遇到了一个sed模拟cat -s
的示例,它将用一条空行替换两条或更多条空行。
命令如下
echo -e "\n-------------\nline1\n\nline2\nline3\n\n\nline4\n\n\n\nlast line\n-------------" | sed '1s/^$//p;/./,/^$/!d'
我了解sed部分包含两个部分。第一个
'1s/^$//p'
将出现在第一行,并且只会在第一行空白处不打印任何内容。好吧,那部分我明白了。现在,对于第二部分
'/./,/^$/!d'
,如果它与/./
,任何单个字符或/^$/
空行都不匹配,它将删除该行。这几乎涵盖了所有内容,不是吗?另一个空行与之匹配后,如何产生一个空行? 最佳答案
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
,那么这是减少冗余空白行的有效方法。关于linux - 为什么 '/./,/^$/!d'在sed中有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48369881/