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

Erw*_*ijk 7 regex perl replace

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

我试过更换:

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

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

Axe*_*man 6

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

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

un-dimensioned $ARGV当前文件名称.因此,对于每个文件,您只替换第一个匹配项."glob" *.css将发送多个文件.如果您执行其他人建议的标量切换,您将仅使用该模式修改第一个文件中的一个匹配项.(虽然,也许这就是你想要的.)


cod*_*ict 5

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

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

  • 或者,更短的:`... -e '!$x && s/.../.../ && ($x=1)'`。此外,这只适用于问题中只有一个文件的情况。不幸的是,它不适用于多个文件。 (2认同)

Alt*_*eus 5

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

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