在OS X中替换单行字符串中的多个模式实例

时间:2013-06-12 12:49:24

标签: regex macos sed

我有以下字符串:

<li>something</li><li>lorem <a href="URL">link</a>ipsum</li><li>dolor sit</li><li>something</li><li>lorem <a href="URL">link</a>ipsum</li><li></li>

使用sed我想删除此行和后续行中<li>lorem <a href="URL">link</a>ipsum</li>的所有实例。

我有以下命令会删除<li>lorem ipsum</li>

的所有实例
sed -i "" 's:<li>lorem[^<]*</li>::g'

但遗憾的是,它无法处理(忽略)替换模式中的<a href="URL">link</a>标记。

有什么建议吗?

由于 ALEV

2 个答案:

答案 0 :(得分:3)

最好使用xml解析器。但是,如果你必须在perl进行此操作。

perl -pe 's,(?<=</li>)<li>lorem.+?</li>(?=<li>),,g' inputFile

测试:

$ cat file
<li>something</li><li>lorem <a href="URL">link</a>ipsum</li><li>dolor sit</li><li>something</li><li>lorem <a href="URL">link</a>ipsum</li><li></li>
$ perl -pe 's,(?<=</li>)<li>lorem.+?</li>(?=<li>),,g' file
<li>something</li><li>dolor sit</li><li>something</li><li></li>

答案 1 :(得分:1)

你可以尝试这个(sed),但我无法在OS X上测试它:

sed  -E 's:<li>lorem (<[^>]*>\S*){2}</li>::g' file

输入:

<li>something</li><li>lorem <a href="URL">link</a>ipsum</li><li>dolor sit</li><li>something</li><li>lorem <a href="URL">link</a>ipsum</li><li></li>

期望的输出:

<li>something</li><li>dolor sit</li><li>something</li><li></li>

我的输出:

<li>something</li><li>dolor sit</li><li>something</li>

正如您所看到的,最后有一点不同。因此,解析 是一个好主意。您可以获得一行的解决方案,但不适用于下一行。