使用不同的参数组合或管道两个sed命令

时间:2015-05-21 09:14:50

标签: bash sed

我有一个包含行的xml文件(不是有效的xml):

 <seg id="65"> Kostenvoranschlag der Werkstatt in vier Schritten</seg>

我想用seg标签的内容替换每一行。所以,这是一个理想的输出:

 Kostenvoranschlag der Werkstatt in vier Schritten

现在这可以很好地收集这些行:

sed -n 's:.*<seg id=.*>\(.*\)</seg>.*:\1:p' file.txt &>log

但是收集“65”&gt; “Kostenvoranschlag”之间的额外空间。为了摆脱这个空间,我可以单独调用以下内容:

sed -i 's/^ *//' log

但我想用管道在一条线上做。我尝试了一些东西,但没有一个起作用:

sed -n 's:.*<seg id=.*>\(.*\)</seg>.*:\1:p; -i s/^ *//' file.txt &>log
sed -n 's:.*<seg id=.*>\(.*\)</seg>.*:\1:p' file.txt ; -i 's/^ *//' &>log

管道不起作用,因为-i不是命令:

sed -n 's:.*<seg id=.*>\(.*\)</seg>.*:\1:p' file.txt | -i 's/^ *//' &>log

有任何评论吗?

2 个答案:

答案 0 :(得分:1)

只需在正则表达式的*部分之后添加此<seg id=.*>

sed -n 's:.*<seg id=.*> *\(.*\)</seg>.*:\1:p' file
                       ^^

这匹配<seg id=XXXX>之后的任意数量的空格(零到n)。

测试:

$ sed -n 's:.*<seg id=.*> *\(.*\)</seg>.*:\1:p' <<< " <seg id="65"> Kostenvoranschlag der Werkstatt in vier Schritten</seg>"
Kostenvoranschlag der Werkstatt in vier Schritten

答案 1 :(得分:1)

如果输入文件是有效的XML文档,请使用带有与您感兴趣的部分匹配的xpath的XML解析器:

xmllint --xpath '//seg/text()' file.xml

这比依赖正则表达式更加简单和强大,正则表达式会破坏许多其他有效的输入,例如包含换行符的文本节点或具有其他属性的<seg>元素。