bash,在一行中删除两次路径中的字符

时间:2014-11-20 09:29:54

标签: xml bash sed

我必须清理一个文件(xml),比如

...
<MSGD:abc xmlns:MSGD="urn:def:xsd:abc.0.0.0">
<HTRT:xyz>00000000</HTRT:xyz>
...

<abc xmlns:MSGD="urn:def:xsd:abc.0.0.0">
<xyz>00000000</xyz>

我搜索并尝试使用sed,因为sed -e 's/<.*:/</g' test.xml但是没找到正确的方法

<abc.0.0.0">
<xyz>

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

因此,如果名称开头出现在:之前,您希望删除XML标记名称中的大写文本。

只需一个命令:

$ sed -r 's#(</?)[A-Z]*:#\1#g' file
<abc xmlns:MSGD="urn:def:xsd:abc.0.0.0">
<xyz>00000000</xyz>
  • (</?)[A-Z]*:查找< +可选/ +大写字母+ :并抓住第一个区块< +可选{{1} })。
  • /替换为catched group
  • 多次
  • \1

或者,分两步:

g
  • sed -e 's#<[A-Z]*:#<#' -e 's#</[A-Z]*:#</#' file 允许您在同一-e调用中执行两个命令。
  • sed查找s/<[A-Z]*:/</ +大写字母,并将其替换为<
  • <查找s#</[A-Z]*#</# +大写字母,并将其替换为</

答案 1 :(得分:0)

试试这个:

sed 's/<[^ >]*:/</g' myfile.txt

答案 2 :(得分:0)

sed 's#<\([^:>]*\):\(.*\)\(/\1\)#<\2#;t
     s#<[^:>]*:#<#' YourFile

posix版本(GNU sed上的--posix

首先测试是否在关闭标记中有剩余的“前缀”,如果没有,只尝试删除前缀