我有一个包含行的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
有任何评论吗?
答案 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>
元素。