使用Perl仅替换特定文件行中的字符串

时间:2015-07-02 03:25:15

标签: bash perl edit

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

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

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

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

然而,我相信这已经忽略了$. = $lineNum并且只对整个文件执行了s/$find/$replace/,这真的很糟糕。

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

1 个答案:

答案 0 :(得分:4)

您正在使用作业=而不是比较==

使用:

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

$find$replace$lineNum的内容有一些警告可能不会成为问题。警告是$find不能包含斜线的问题; $replace也不能包含斜杠; $lineNum需要是一个行号;注意其他可能会混淆代码的额外字符。

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