我有这个文本文件或sdout:
text1
text2
text1
text2
text1
text2
我有这个代码:
perl -pe "s/text2\n\z/text3/s" text.txt #Note the modifier "/s"
我和 \z 希望他明白这是 eof 之前的最后一行,因此我期望:
text1
text2
text1
text2
text1
text3
但相反它返回:
text1
text3text1
text3text1
text3 #without final newline
我究竟做错了什么?
答案1
命令行选项-p
意味着文件逐行处理,即您所做的基本上是:
while (<>) {
s/text2\n\z/text3/s;
print $_
}
因此,\z
并不匹配所有输入数据的结尾,而是匹配每行的结尾。
您可能需要的不是使用-p
,而是读取整个文件并仅替换结尾。请注意,只需使用$
和/s
不需要,就可以简化正则表达式\z
:
perl -e 'local $/; (my $x = <>) =~s{text2$}{text3}; print $x' text.txt
答案2
没有必要读取整个文件。使用这个 Perl 单行命令:
perl -lpe 's{text2}{text3} if eof ' in_file
印刷:
text1
text2
text1
text2
text1
text3
答案3
我采取的解决方案是:
perl -0pe 's/text2\s*$/text3\n/' text.txt