为什么这个 sed 命令会打印所有行?

为什么这个 sed 命令会打印所有行?

为什么这个 sed 命令: sed /^a/,/i$/p 打印所有行,而不仅仅是以“a”开头并以“i”结尾的行?我不太清楚如何sed /BEGIN/,/END/p运作。

标准输入:

arthuri
John
Johnny
Michael 

标准输出:

arthuri
arthuri
John
John
Johnny
Johnny
Michael
Michael

答案1

sed默认情况下,只要d尚未调用该命令,就会在每个周期结束时打印模式空间。

可以使用该选项或通过将脚本-n的第一行设置为:来禁用该功能。sed#n

所以,在这里,除了默认打印之外,您还要sed告诉a打印以第一行开头和结尾的行开始的模式空间在那之后以 结尾i

输入的第一行 ( arthuri) 以 开头a,但之后没有任何行以 结尾i,因此该/^a/,/i$/范围永远不会终止,并且所有行都会被打印(由于默认在末尾打印两次)。

sed范围将始终包含至少 2 行(除非在输入的最后一行开始的特殊情况)。

要允许起始行和结束行相同(就像同时以 开头和以 结尾的arthuri情况一样),您可以使用:aiawk

awk '/^a/, /i$/'

或者perl

perl -ne 'print if /^a/ .. /i$/'

a如果您想打印以 开头和结尾的行i,则不会使用地址范围,而只需:

sed '/^a/!d; /i$/!d'

或者:

sed '/^a.*i$/!d'

或者:

sed -n '/^a.*i$/p'

虽然在这里,您也可以使用grep

grep -x 'a.*i'

请注意^, 、*$是许多 shell 语法中的特殊字符。通常,您想要引用sed代码参数。

相关内容