2011-06-08 68 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 
相關問題