2011-06-08 84 views
5

我需要替换多个CSS文件中的一些文本,但是第一次出现。只用多个文件替换多个文件中的第一个匹配

我试着更换:

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

但这种替代的每次发生后的值“宽度”的文件,即使我不使用/ g的改性剂。 我在最近的Ubuntu机器上运行这个。

回答

3

你可以第一个后停止更换:

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

或者更短:'... -e'!$ x && s/.../.../&&($ x = 1)''。此外,只有在问题中只有一个文件时才有效。不幸的是,它不适用于多个文件。 – musiKk 2011-06-08 11:45:06

+0

这个为我工作,thanx! – 2011-06-08 12:51:24

+0

@musikk,这就是为什么我贡献了我的答案,这将适用于多个文件。 – Axeman 2011-06-08 13:25:13

0

你可以试试这个:

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

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

6

没有人解决了您的实际题目问题的含义。我建议同样的方法在此使用,仅修改:

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

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

+0

好的解决方案。我不知道'$ ARGV'包含当前文件的名称。 – musiKk 2011-06-08 13:33:31

+0

@musiKk,http://perldoc.perl.org/perlvar.html#$ARGV – Axeman 2011-06-08 13:37:37

+0

是的,谢谢。我找到了。 :) – musiKk 2011-06-08 13:38:34

4

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

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