我有这个文本文件或 sdout:
text1
text2
text1
text2
text1
text2
Run Code Online (Sandbox Code Playgroud)
我有这个代码:
perl -pe "s/text2\n\z/text3/s" text.txt #Note the modifier "/s"
Run Code Online (Sandbox Code Playgroud)
我和 \z 希望他明白这是 eof 之前的最后一行,因此我希望:
text1
text2
text1
text2
text1
text3
Run Code Online (Sandbox Code Playgroud)
但它返回:
text1
text3text1
text3text1
text3 #without final newline
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
命令行选项-p意味着文件是逐行处理的,即你所做的基本上是:
while (<>) {
s/text2\n\z/text3/s;
print $_
}
Run Code Online (Sandbox Code Playgroud)
因此\z不匹配所有输入数据的结尾,而是匹配每一行的结尾。
您可能需要的不是使用-p而是读取完整文件并仅替换结尾。请注意,正则表达式可以通过仅使用$和来简化,/s并且\z不需要:
perl -e 'local $/; (my $x = <>) =~s{text2$}{text3}; print $x' text.txt
Run Code Online (Sandbox Code Playgroud)