我有一个脚本,我用于大规模查找和替换。当在特定文件中找到匹配项时,我会记录文件名和行号。
我想要做的是针对每个文件名,行号对,仅在文件的该行上将字符串从<foo>
更改为<bar>
。
在我的shell脚本中,我正在给定行号的文件上执行查找和替换命令...
run=`perl -pi -e "s/$find/$replace/ if $. = $lineNum" $file`
然而,我相信这已经忽略了$. = $lineNum
并且只对整个文件执行了s/$find/$replace/
,这真的很糟糕。
我有什么想法可以做到这一点吗?
答案 0 :(得分:4)
您正在使用作业=
而不是比较==
。
使用:
perl -pi -e "s/$find/$replace/ if $. == $lineNum" $file
对$find
,$replace
和$lineNum
的内容有一些警告可能不会成为问题。警告是$find
不能包含斜线的问题; $replace
也不能包含斜杠; $lineNum
需要是一个行号;注意其他可能会混淆代码的额外字符。
我不明白为什么你想要在写入文件时捕获Perl进程的标准输出,而不是标准输出。因此,run
的分配难以置信。如果有必要,您可能最好使用run=$(perl …)
代替$()
`…`
表示法。