2011-12-16 59 views
1

我想用sed替换font-family: ([A-Za-z ,"]+){1};的所有实例与font-family: Verdana。在过去,下面的命令为简单搜索&工作替换:sed mass通过终端替换CSS样式

find ./ -type f -exec sed -i 's/needle/replace/' {} \; 

不过,我想没有成功以下的正则表达式:

find ./ -type f -exec sed -i 's/(font\-family:){1}([\"A-Za-z, ]+){1}(;){1}/font\-family: Verdana;/' {} \; 

我在红帽企业Linux服务器版本5.6。此外,第一条命令似乎只对任何给定文件中的第一个实例起作用,这意味着我必须重新运行该命令,直到每个实例被替换为止......我能否改进该命令以处理所有文件的所有实例?

+0

你有没有尝试使用`g`选项全局替换。 `sed's/needle/replace/g'` – 2011-12-16 21:43:50

回答

3

首先,解释你为什么不起作用。你需要逃避所有的括号,括号和+的,所以下面应该工作:

sed -i 's/\(font\-family:\)\{1\}\(["A-Za-z, ]\+\)\{1\}\(;\)\{1\}/font-family: Verdana;/' 

幸运的你可以添加-r开关,以避免需要为所有逃逸的,但你也可以简化你目前的表达很多。您不需要将每个部分放入捕获组中,并且将{1}添加到每个组都是多余的(基本上这是默认设置)。所以,你可以将其降低到:

sed -ri 's/font-family:["A-Za-z, ]+;/font-family: Verdana;/g' 

注意添加g选项全局替换,因为你想这对每个出现的。

一起:

find ./ -type f -exec sed -ri 's/font-family:["A-Za-z, ]+;/font-family: Verdana;/g' {} \; 
+0

很好,谢谢你的解释。 – lioman 2011-12-16 22:37:40

0

尝试这样的事情 -

sed -i 's/\(font-family:\) \(.*[^;]\)\(;.*\)/\1 Verdana\3/g' 
0

我不知道我完全理解你FONT-FAMILY expresion:font-family: ([A-Za-z ,"]+){1};那些是匹配的括号和你正在寻找{1}只有一个匹配?

你的正则表达式是刚刚够复杂了,我会从sedperl -pi切换:

find ./ -type f -exec perl -pi -e 's/font-family:[\"A-Za-z, ]+;/font-family: Verdana;/g' {} \; 
1

的问题是,你需要在你的sed -r,因为你使用+

看到下面的测试:

kent$ echo "oldstring_0000"|sed 's/[0]+/newstring/' 
oldstring_0000 

nothing happened. 

now with -r: 

kent$ echo "oldstring_0000"|sed -r 's/[0]+/newstring/' 
oldstring_newstring 

此外,如果你想更换所有,你需要 'G' 像 'S/A/b/G'