sed - 以xml

时间:2017-05-19 11:13:01

标签: xml bash sed

我试图使用bash脚本和sed来操作xml文件而无法获取它。 xml中的结构看起来像

<Name>title firstname lastname</Name><Home>+49 (30) 1234 94</Home><Mobile>+49 (171) 1234 94</Mobile>
<Name>title firstname lastname</Name><Home>+49 (30) 1234 94</Home><Mobile>+49 (171) 1234 94</Mobile>

我需要删除电话号码中的space(以及) 。经过一天的正规用法和sed,我无法得到它。我有根据需要匹配的字符串,但我无法获得组和正确的替换。

sed -e 's/([0-9]\s|[0-9]\s\([0-9]|[0-9]\)\s[0-9]|[0-9]\s[0-9])/gm'

3 个答案:

答案 0 :(得分:3)

请勿使用 sed 来操作XML文档。
这项活动有很好的工具。
xmlstarlet就是其中之一。

有效的XML结构需要在节点树顶部有一个根元素 假设我们有一个XML片段(test.xml):

<root>
    <Name>title firstname lastname</Name>
    <Home>+49 (30) 1234 94</Home>
    <Mobile>+49 (171) 1234 94</Mobile>
    <Name>title firstname lastname</Name>
    <Home>+49 (30) 1234 94</Home>
    <Mobile>+49 (171) 1234 94</Mobile>
</root>

命令

xmlstarlet ed -u "//Home|//Mobile" -x "translate(normalize-space(.),'() ','')" test.xml

<强> 详细

ed - 启用编辑模式

-u - 更新xml结构

"//Home|//Mobile" - 用于选择所需元素的xpath表达式

-x - 使用xpath表达式更新所需的值

.(句号) - 指向当前所选节点

normalize-space() - 通过剥离前导和尾随空格并用空格替换空格字符序列来返回带有空格的参数字符串的函数

translate(string, string, string) - 返回第一个参数字符串的函数,第二个参数字符串中出现的字符被第三个参数字符串中相应位置的字符替换。

输出:

<?xml version="1.0"?>
<root>
  <Name>title firstname lastname</Name>
  <Home>+4930123494</Home>
  <Mobile>+49171123494</Mobile>
  <Name>title firstname lastname</Name>
  <Home>+4930123494</Home>
  <Mobile>+49171123494</Mobile>
</root>

答案 1 :(得分:0)

假设数字的格式保持不变:

sed -r 's/(\+[0-9]{2}) \(([0-9]{2,3})\) ([0-9]{4}) ([0-9]{2})/\1\2\3\4/g' input
<Name>title firstname lastname</Name><Home>+4930123494</Home><Mobile>+49171123494</Mobile>
<Name>title firstname lastname</Name><Home>+4930123494</Home><Mobile>+49171123494</Mobile>

答案 2 :(得分:0)

<Name>title firstname lastname</Name><Home>0049 (30) 1234567 94</Home><Mobile>+491711234577 0</Mobile>
<Name>title firstname lastname</Name><Home>+1 39976 1234 94</Home><Mobile>+49 (171) 1234 94</Mobile>    

sed -r 's/(\+|\d*?) ([0-9]{1,})|\s\(([0-9]{2,})\) ([0-9]{2,}) ([0-9]{1,4})/\1\2\3\4\5/g' input (see above)

<Name>title firstname lastname</Name><Home>004930123456794</Home><Mobile>+4917112345770</Mobile>
<Name>title firstname lastname</Name><Home>+139976123494</Home><Mobile>+49171123494</Mobile>