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.