我遇到了一个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/

10-11 22:47
查看更多