sed mass通过终端替换CSS样式

时间:2011-12-16 21:37:36

标签: regex linux sed terminal find

我想使用font-family: ([A-Za-z ,"]+){1};font-family: Verdana的所有实例替换为sed。过去,以下命令适用于简单搜索&替换:

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;/' {} \;

我在Red Hat Enterprise Linux Server 5.6版上。此外,第一个命令似乎只适用于任何给定文件中的第一个实例,这意味着我必须重新运行该命令,直到每个实例都被替换...我可以改进命令来处理所有文件的所有实例吗?

4 个答案:

答案 0 :(得分:4)

首先,解释为什么你的工作不起作用。您需要转义所有括号,方括号和+,因此以下内容应该有效:

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' {} \;

答案 1 :(得分: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'

答案 2 :(得分:0)

尝试这样的事情 -

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

答案 3 :(得分:0)

我不确定我是否完全理解你的font-family expresion:font-family: ([A-Za-z ,"]+){1};那些匹配的parens并且你正在寻找{1}一个匹配?

您的正则表达式非常复杂,我已从sed切换到perl -pi

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