我想使用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版上。此外,第一个命令似乎只适用于任何给定文件中的第一个实例,这意味着我必须重新运行该命令,直到每个实例都被替换...我可以改进命令来处理所有文件的所有实例吗?
答案 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' {} \;