我有一个用于大规模查找和替换的脚本。当在特定文件中找到匹配项时,我会记录文件名和行号。
我想做的是对每个文件名,行号对,从<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 …)
和 $()
符号代替 `...`
.
关于bash - 使用 Perl 仅替换文件的某一行中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31175094/