在sed中加入行范围的正则表达式

时间:2012-01-09 19:57:03

标签: linux bash sed

我有以下代码,可以在标签<p> </ p>中找到所有<TXT_accesp> </TXT_accesp>并删除它们。这段代码可以正常工作:

find /home -type f -name "*.html" -exec \
    sed -i '/\<TXT_accesp\>/,/\<\/TXT_accesp\>/s@</\?p>@@g' {} \;

问题是我需要添加更多标签。现在您必须删除<p> </ p>内或<TXT_accesp> </TXT_accesp>内的所有<TXT_acceng> </TXT_acceng>但我无法加入正则表达式OR,我收到错误(该命令不存在,好像很糟糕完成)。

find /home -type f -name "*.html" -exec \
    sed -i '/\<TXT_accesp\>/,/\<\/TXT_accesp\>\||\<TXT_acceng\>/,/\<\/TXT_acceng\>/s@</\?p>‌​@@g' {} \;

1 个答案:

答案 0 :(得分:3)

sed不支持行范围之间的交替(OR或||)。有些版本支持在正则表达式中使用交替的扩展正则表达式,但是你需要的是sed的两个命令-e选项(为了便于阅读):

find /home -type f -name "*.html" -exec \
    sed -i -e '/\<TXT_accesp\>/,/\<\/TXT_accesp\>/s@</\?p>@@g' \
           -e '/\<TXT_acceng\>/,/\<\/TXT_acceng\>/s@</\?p>@@g' \
        {} \;

你可以将它折叠到一行;你不应该这样做。