bash perl \z 不起作用

bash perl \z 不起作用

我有这个文本文件或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

相关内容