我有一个用于大规模查找和替换的脚本。在特定文件中找到匹配项时,我记录文件名和行号。
我想要做的是为每个文件名,行号对,串从改变<foo>到<bar>仅该行的文件。
在我的Shell脚本中,我在给定行号的情况下在文件上执行查找和替换命令...
run=`perl -pi -e "s/$find/$replace/ if $. = $lineNum" $file`
Run Code Online (Sandbox Code Playgroud)
但是,我认为这一直忽略了整个文件,$. = $lineNum而只是这样做了s/$find/$replace/,这确实很糟糕。
有什么想法可以做到吗?
您正在使用分配=而不是比较==。
使用:
perl -pi -e "s/$find/$replace/ if $. == $lineNum" $file
Run Code Online (Sandbox Code Playgroud)
关于的内容有一些警告$find,$replace并且$lineNum可能不会成为问题。注意事项是$find不能包含斜线的问题;$replace也不能包含斜线;$lineNum必须是行号;当心其他多余的多余字符,可能会使代码混乱。
我不明白为什么您要在Perl进程写入文件而不是标准输出时捕获其标准输出。因此,分配给run是不可行的。如果有必要,你很可能会关闭使用更好的run=$(perl …)与$()到位的符号`…`。