使用sed在同一行上匹配相同的模式n次

时间:2018-09-24 11:55:58

标签: shell unix sed

我有一个输入文件 div.txt ,如下所示:

<div>a</div>b<div>c</div>
<div>d</div>

现在,我想使用 sed 选择所有 div 标签和它们之间的文本:

sed -n 's:.*\(<div>.*</div>\).*:\1:p' < div.txt

我得到的结果:

<div>c</div>
<div>d</div>

我真正想要的是

<div>a</div>
<div>c</div>
<div>d</div>

所以问题是,如何在同一行上匹配同一模式n次? (请不要建议我使用perl或python)

2 个答案:

答案 0 :(得分:1)

这可能对您有用(GNU sed):

sed 's/\(<\/div>\)[^<]*/\1\n/;/^</P;D' file

替换</div>,后跟零个或多个非<本身的字符和换行符。仅打印以<开头的行。

答案 1 :(得分:0)

Sed不是处理HTML的正确工具。

但是,如果您真的坚持,并且知道您的输入将始终具有正确封闭的div标签对,则可以用换行符替换div之外的所有内容:

sed 's=</div>.*<div>=</div>\n<div>='