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

Bash 使用Perl仅替换文件某一行中的字符串,bash,perl,edit,Bash,Perl,Edit,我有一个用于大规模查找和替换的脚本。当在特定文件中找到匹配项时,我会记录文件名和行号 我要做的是,对于每个文件名、行号对,仅在文件的该行上将字符串从更改为 在我的shell脚本中,我在给定行号的文件上执行查找和替换命令 run=`perl -pi -e "s/$find/$replace/ if $. = $lineNum" $file` 然而,我认为这忽略了$$lineNum并且只对整个文件执行s/$find/$replace/,这非常糟糕 你知道我该怎么做吗?你使用的是赋值=而不是比较=

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

我要做的是,对于每个文件名、行号对,仅在文件的该行上将字符串从
更改为

在我的shell脚本中,我在给定行号的文件上执行查找和替换命令

run=`perl -pi -e "s/$find/$replace/ if $. = $lineNum" $file`
然而,我认为这忽略了
$$lineNum
并且只对整个文件执行
s/$find/$replace/
,这非常糟糕


你知道我该怎么做吗?

你使用的是赋值
=
而不是比较
=

使用:

其中关于
$find
$replace
$lineNum
的内容有一些警告,这些可能不会成为问题。注意事项是,
$find
不能包含斜杠
$replace
也不能包含斜杠
$lineNum
需要是行号;小心其他可能混淆代码的无关字符


我不明白为什么要在Perl进程写入文件时捕获标准输出,而不是标准输出。因此,
run
的赋值是不可信的。如果有必要,您最好使用
run=$(perl…
)和
$()
符号来代替
```

=
是赋值<代码>=是比较。$&#@。。在第二双眼睛帮助我之前,我是怎么看不到这一点的……这是大脑的工作方式,而不是发现显而易见的东西。这就是为什么结对编程是一种很好的工作方式;这也是为什么代码审查是一个非常好的主意(尽管在本例中,您在到达代码审查点时遇到了问题)。这也是
严格的
警告的重点之一。
perl -pi -e "s/$find/$replace/ if $. == $lineNum" $file