sed 中 {//!p;} 的名称和含义

Pra*_*ngh 2 bash scripting sed

我正在寻找一个 sed 命令,它可以打印模式匹配旁边的行直到文件末尾。

不知怎的,我得到了这个命令:

sed -n '/pattern match/,${//!p;}' Readme
Run Code Online (Sandbox Code Playgroud)

这确实解决了目的,但我不明白{//!p;}。它叫什么或者有什么用途?

因此,如果我想根据不同的场景跳过多行,而不仅仅是具有模式的行,我应该能够做到这一点。

我知道有不同的命令可以解决这个目的;grep、awk 是最接近的。但我想了解这种方法。

也对问题的标题感到抱歉,因为我无法更好地了解如何提出此查询。

Ben*_* W. 6

一个空的正则表达式,//按照手册

重复最后一个正则表达式匹配(如果将空正则表达式传递给命令,则同样有效s

所以命令

sed -n '/pattern match/,${//!p;}'
Run Code Online (Sandbox Code Playgroud)

采用地址范围:从第一次出现匹配的行/pattern match/到文件末尾 ( $)。对于该范围内的每一行,//!p运行;这相当于/pattern match/!p上面的内容,即“如果该行不匹配/pattern match/,则打印它”。

因此,完整命令会打印从模式第一次出现到最后一行的所有行,但会抑制匹配的行。文件

line 1
line 2
pattern match
line 4
pattern match
line 6
Run Code Online (Sandbox Code Playgroud)

会成为

line 4
line 6
Run Code Online (Sandbox Code Playgroud)