使用 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 …)
和 $()
符号代替 `…`
.
我有一个用于大规模查找和替换的脚本。当在特定文件中找到匹配项时,我会记录文件名和行号。
我想要做的是对于每个文件名,行号对,仅在文件的那一行将字符串从 <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 …)
和 $()
符号代替 `…`
.