bash - 使用 Perl 仅替换文件的某一行中的字符串

标签 bash perl edit

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

我想做的是对每个文件名,行号对,从<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/

相关文章:

bash - 如果使用 Bash 目录为空,则不显示结果

bash - sed中的变量

Bash - 用 `set` 恢复位置参数有什么意义?

java - 如何在 bash 文件中添加依赖项?

linux - 如何在没有密码提示的情况下从脚本写入/etc/sudoers 文件?

regex - 使用 perl 提取电子邮件的一部分

javascript - 如何在 Javascript 中编写此数字检测正则表达式?

Perl 正则表达式从命令行对文件进行操作

python - 如何在 python 中使用 kivy 在 TextInput 中启用/禁用编辑

cakephp - 如何从编辑或创建中判断我是否处于 beforeSave 状态?蛋糕PHP