请参阅sed中正则表达式中的匹配字符串?

时间:2014-02-04 17:17:36

标签: regex bash sed

我正在尝试执行以下操作:

我有一个包含html标签的文件,例如"<span class='A'> blah </span>""<span class='B'> blah </span>"等。

我想用"<span class='A'> blah </span>"替换** blah **的所有出现。所以我尝试使用sed。

sed "s/<span class='A'>/*/g" myfile后跟

sed "s/<\span>/*/g" myfile

这几乎让我得到了我想要的东西,但也弄乱了其他课程的结束范围标签,这是我不想要的。

理想情况下,我想要某种方式来引用

中的[^&lt;] *匹配的文本

sed s/<span class='A'>[^<]*</span>/my_replacement_character/g

1 个答案:

答案 0 :(得分:2)

您可以使用捕获组和反向引用。在大多数正则表达式中,您可以指定带括号的捕获组,在sed中您需要转义括号,因此您可以将[^<]*更改为\([^<]*\)。然后在替换中,您可以使用\1来引用捕获的内容。

最后,看起来应该是这样的:

sed "s/<span class='A'>\([^<]*\)<\/span>/**\1**/g"

在某些GNU sed(以及可能的其他实现)中,您可以使用-r--regexp-extended标志使sed正则表达式与其他版本更加一致。这样你就不需要逃避括号:

sed -r "s/<span class='A'>([^<]*)<\/span>/**\1**/g"