使用sed删除名称空间前缀

时间:2016-12-26 18:40:33

标签: xml bash sed

我想转换这段xml:

<v1:table>
  <v1:tr>
    <v1:td>Apples</v1:td>
    <v1:td>Bananas</v1:td>
  </v1:tr>
</v1:table>

通过删除名称空间前缀(即v1)并使用 sed 获得以下内容:

<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

有可能吗?

编辑:我还想声明xml保存在文件中。

2 个答案:

答案 0 :(得分:3)

您可以使用W3C HTML-XML-utils packaged for many distributions中的hxpipehxunpipe来完成此操作:

$ hxpipe infile | sed 's/^\([()]\)v1:/\1/g' | hxunpipe
<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

hxpipe解析XML / HTML并将其转换为awk / sed友好的基于行的格式:

$ hxpipe infile
(v1:table
-\n  
(v1:tr
-\n    
(v1:td
-Apples
)v1:td
-\n    
(v1:td
-Bananas
)v1:td
-\n  
)v1:tr
-\n
)v1:table
-\n

()开头的行是开始和结束标记,因此从v1:(开始的行中删除第一个)是上面的sed命令所做的)达到了预期的效果。请注意,文本行以-开头,因此不会出现任何误报。

答案 1 :(得分:1)

这个sed适用于你的例子:

sed -E 's~(</?)v1:~\1~g' file

<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

然而,只是注意sed不是解析HTML / XML的最佳工具。考虑使用HTML解析器。