1

这可能有点复杂,但它是这样的:假设我有一个如下所示的 XML:

<a>
<b>000</b>
<c>111</c>
<b>222</b>
<d>333</d>
<c>444</c>
</a>

我如何在 Mac 上使用 sed 得到如下所示的 XML:

<a>
<b>111 000</b>
<b>222</b>
<d>333</d>
<c>444</c>
</a>

基本上:

  • 匹配格式为 <b>...</b> 后跟 </c>...</c> 的 2 个连续行
  • 取 <c>...</c> 之间的值并将其(加上一个空格字符)放在 <b> 之后的前一行
  • 删除第二行 <c>...</c>

谢谢你。

如果 sed 太多了,请提供其他建议,只要我可以从 mac shell 运行它。

4

2 回答 2

1

不是最漂亮的解决方案,但它似乎可以工作:-)

$ tr '\n' @ < input | sed  's#<b>\([0-9]\+\)</b>@<c>\([0-9]\+\)</c>#<b>\2 \1</b#g' | tr @ '\n'

输出:

<a>
<b>111 000</b
<b>222</b>
<d>333</d>
<c>444</c>
</a>

或更笼统地说:

$ tr '\n' @ < f1 | sed  's#<b>\([^<]*\)</b>@<c>\([^<]*\)</c>#<b>\2 \1</b#' | tr @ '\n'

用于[^<]匹配括号之间的任何内容

于 2013-04-19T19:53:09.980 回答
0

Ruby 将支持多行模式:

ruby -e 'print gets(nil).sub(/<b>([^\n]*)<\/b>\n<c>([^\n]*)<\/c>/m,"<b>\\2 \\1</b>")' file.txt

于 2013-04-19T21:57:36.417 回答