2012-06-21 32 views
1

我需要修改使用SED在文件中搜索和替换的现有脚本。 我的问题是,我需要使用sed来执行相同的搜索和替换,但只有满足2个条件。在2个搜索条件下使用SED

我使用find和sed象下面这样:

find . -name 'search.do*' -exec sed -i "/href/\ 
s/href=\"[^\"]*sommerhus\/detail\.do[^\"]*unitId=\([^\"]*\)\"/href=\"sommerhus-\1.html\"/g" {} \; 

但现在我需要确保仅更换发生如果“href”,该另一个搜索条件满足FX的“href” & &“语言“

我试过用-e但没有成功。 可能吗?

回答

4

您可以使用/href.*language\|language.*href/(可能带有一些额外的限制,如每个匹配中第二个单词之前的空格)。

你也可以嵌套在块中的命令:

sed '/href/{ /language/s/<match>/<replace>/ }' 

这是更可扩展的:将第三图案在一对括号的和图案仅需要添加,虽然上述的交替的解决方案需要在6种型态总数(每个可能的订单一个)。


此外,保存具有反斜杠图案内的/,sed的允许您使用任何字符作为分隔符,例如@

find . -name 'search.do*' -exec sed -i "/href/\ 
[email protected]=\"[^\"]*sommerhus/detail\.do[^\"]*unitId=\([^\"]*\)\"@href=\"sommerhus-\1.html\"@g" {} ;' 

(小利在这种情况下,但很高兴知道的其他情形处理文件路径或URL时等)

+0

TIL关于'嵌套searchpatterns sed'虽然使用它,因为犯错,当我年轻的时候,谢谢@dbaupp。 –

+1

+1:也请注意可以避免一些冗余:'sed'/ language/{\ @href =“[^”] * sommerhus/detail \ .do [^“] * unitId = \([^”] * \)“@ s // href =”sommerhus- \ 1.html“/ g}' –

+0

我用你提供的简单解决方案与href。*语言,应该有这个想法,但是非常感谢。 –