为什么'/./,/^$/!d'对sed有影响?

时间:2018-01-21 17:50:09

标签: linux bash sed scripting

我找到了一个模拟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',如果该行与/./,任何单个字符或/^$/空行不匹配,它将删除该行。那几乎涵盖了什么,不是吗?如何在另一个空行与之匹配之后出现空行?

1 个答案:

答案 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,那么这是减少多余空行的有效方法。