假设我有一个包含文本
foo_bar_baz
的文件,并且我想将其替换为 foo_bar_1234
(这是更复杂问题的简化版本)。
第一次尝试:
$ echo "foo_bar_baz" > testfile
$ perl -pi -e "s/(foo_)(bar_).*/\1\2 1234/" testfile
$ cat testfile
foo_bar_ 1234
所以,我只需要去掉
1234
之前的空格即可。显而易见的答案是
$ perl -pi -e "s/(foo_)(bar_).*/\1\21234/" testfile
...但这行不通。替换中包含八进制字符
\212
。我该如何解决?八进制问题简要介绍了here,但我似乎错过了答案。该文档指出“只有在其前面至少有 10 个左括号时,Perl 才会通过解释为反向引用来解决这种歧义”,但这里显然不是这种情况。此外,使用 \g2
或 \g{2}
并不能解决问题。
我使用的是 Perl 5.34.0,bash 5.1.16。
替换文本应使用
$1
代替 \1
来表示捕获组的内容。与任何其他参数扩展一样,您可以使用 {...}
分隔参数名称。
perl -pi -e 's/(foo_)(bar_).*/$1${2}1234/' testfile
(请注意使用单引号来简化对
$1
和 $2
的转义,以避免在 Perl 看到要执行的脚本之前对每个内容进行 shell 插值。)