使用perl仅替换多个文件中的第一个匹配项

时间:2011-06-08 11:31:48

标签: regex perl replace

我需要在多个css文件中替换一些文本,但是在第一次出现的时候。

我试过替换为:

perl -pi -e 's/(width:).*;/$1 100%;/' filename.css

但是,即使我没有使用/ g修饰符,这也会在文件中每次出现'width:'后替换该值。 我在最近的Ubuntu机器上运行它。

5 个答案:

答案 0 :(得分:6)

没人提到你的实际头衔问题的含义。我建议采用与此处相同的方法,仅修改:

perl -pie '!$subbed{$ARGV} and s/(width:).*;/$1 100%;/ and $subbed{$ARGV}++' *.css

未标注的$ARGVname of the current file。因此,对于每个文件,您只替换第一个匹配项。 “glob”*.css将发送多个文件。如果您执行其他人建议的标量开关,您将仅使用该模式修改 first 文件中的第一个匹配项。 (虽然,也许这就是你想要的。)

答案 1 :(得分:5)

如果你在段落模式下阅读,每个文件只有一行;因此没有/ g修饰符的s ///将替换每个文件中的第一个实例,然后移动到下一个文件:

perl -0777 -pi -e's/(width:).*;/$1 100%;/' *.css

答案 2 :(得分:4)

您可以在第一个之后停止更换:

perl -pi -e '$a=1 if(!$a && s/(width:).*;/$1 100%;/);' filename.css

答案 3 :(得分:0)

你可以试试这个:

perl -pi -e 's/(width:).*;/$a?$&:++$a&&"$1 100%;"/e' filename.css

答案 4 :(得分:0)

也许s/(width:).*;/$1 100%;/o会这样做?