sed 的 P 命令如何工作?

sed 的 P 命令如何工作?

sed 的文件指出

打印到当前模式空间的第一个嵌入换行符。

我做了一些实验并试图理解它。下面是我的测试。

root:[~]# seq 3 | sed -n '/2/{iline1\nline2;P}'
sed: -e expression #1, char 0: unmatched `{'
root:[~]#

这里-n禁用模式空间的自动打印。/2/匹配第二行,其中内容为2。因此,当第二行被匹配时,模式空间就有内容2。该i命令将line1\nline2一个换行符插入到模式空间的开头。所以模式空间应该有内容line1\nline2\n2。现在P命令打印到第一个新行,所以line1应该被打印并且应该是整个命令的结果。我的理解正确吗?为什么会出现错误?提前致谢。

答案1

i命令不会将任何内容插入模式空间。它将文本写入标准输出。

这是一个更好的例子:

$ cat file
line 1
line 2
line 3
line 4
$ sed -n 'N;P' file
line 1
line 3

sed脚本将一行读入模式空间。该N命令将下一行输入附加到模式空间,并在其间嵌入换行符。将P第一行写入到N模式空间中插入的换行符处。下一个周期开始(由于 ,在周期结束时没有输出-n)。

答案2

对于错误:您需要在命令文本后添加一个文字(无反斜杠)换行符i。在 GNU sed 中你可以逃脱

seq 3 | sed -n -e '/2/{iline1\nline2' -e 'P}'

就像你逃脱了\n换行符一样。

否则:

seq 3 | sed -n '/2/{i\
line1\
line2
P;}'

至于您的说法:i命令“插入”到输出文件中,而不是插入到模式空间中。在更正的示例中,模式空间将为 2,这P将完整打印,因为它不包含换行符。

一般来说,GNU sed 的联机帮助页很混乱,只能参考 GNU 扩展。我推荐标准规格,这更具可读性:

[1addr]i\
text
       Write text to standard output.
[2addr]P
       Write the pattern space, up to the first <newline>, to standard
       output.

相关内容