为什么这个 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
情况一样),您可以使用:a
i
awk
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
代码参数。