使用 Perl 仅替换文件的某一行中的字符串

Using Perl to replace a string in only a certain line of file

我有一个用于大规模查找和替换的脚本。当在特定文件中找到匹配项时,我会记录文件名和行号。

我想要做的是对于每个文件名,行号对,仅在文件的那一行将字符串从 <foo> 更改为 <bar>

在我的 shell 脚本中,我在给定行号的文件上执行查找和替换命令...

run=`perl -pi -e "s/$find/$replace/ if $. = $lineNum" $file`

但是我认为这忽略了 $. = $lineNum 并且只对整个文件执行了 s/$find/$replace/,这真的很糟糕。

有什么办法可以做到这一点吗?

您正在使用赋值 = 而不是比较 ==

使用:

perl -pi -e "s/$find/$replace/ if $. == $lineNum" $file

关于 $find$replace$lineNum 内容的一些注意事项可能不会成为问题。需要注意的是 $find 不能包含斜线; $replace 也不能包含斜杠; $lineNum 需要是行号;当心可能混淆代码的其他无关的额外字符。

我不明白您为什么要在写入文件时捕获 Perl 进程的标准输出,而不是标准输出。因此,分配给 run 是不可信的。如果有必要,最好使用 run=$(perl …)$() 符号代替 `…`.