bash perl \z 不起作用

Mar*_*mbo 3 bash regex perl

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

我究竟做错了什么?

Ste*_*ich 6

命令行选项-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)

  • @MarioPalumbo:`local $/` 将 `$/` 隐式设置为 undef 。`$/` 是 INPUT_RECORD_SEPARATOR,默认情况下是换行符,但现在更改为 undef - 这意味着 `&lt;&gt;` 在整个文件中含糊不清。有关详细信息,请参阅 `perldoc perlvar`,其中还包括与我使用过的代码类似的示例。 (2认同)