使用sed命令删除xml文件中的特殊字符

时间:2018-01-03 20:13:45

标签: xml linux bash sed

我尝试使用以下方法从XML文件替换特殊字符(。):

 find . -type f -name "*.XML" -exec sed -e 's/\.//g' {} +

我的文件内容如下,字符串值是动态的或重复的。它必须专门搜索它并替换忽略特殊字符的内容。

示例1:

<TotalSum>1000.01</TotalSum><Info><Value>DDAB.A1234 1000.01</Value></Info>

输出应为

<TotalSum>1000.01</TotalSum><Info><Value>DDABA1234 1000 01</Value></Info>

示例2:

<TotalSum>300.89</TotalSum><Info><Value>A.1234567 100.14 B.1234567 200.75</Value></Info>

输出应为

<TotalSum>300.89</TotalSum><Info><Value>A1234567 100 14 B1234567 200 75</Value></Info>

我尝试执行的脚本如下所示,因为我只需要从<Value>字段中删除特殊字符:

$search_text=`grep -i Value filename`
for i in $search_text
 do
    sed -e 's/\.//g'
 done

1 个答案:

答案 0 :(得分:1)

GNU sed与扩展正则表达式一起使用:

sed -r '
    :del 
    s#(<Value>.*[[:digit:]])\.(.*</Value>)#\1 \2# 
    s#(<Value>.*[[:alpha:]])\.(.*</Value>)#\1\2#
    tdel
' file

或作为单行:

sed -r ':del; s#(<Value>.*[[:digit:]])\.(.*</Value>)#\1 \2#; s#(<Value>.*[[:alpha:]])\.(.*</Value>)#\1\2#; t del' file
  • -r用于扩展正则表达式。这只是为了方便,否则您将不得不使用\( ... \)
  • s#text#replacement#您也可以选择不同的分隔符,以方便使用。然后就没有必要逃避文字/
  • :del是标签的定义
  • ( )使用\1\2,...
  • 保存稍后back-referenced的匹配项 如果tdel命令更改了行,则
  • :del会跳转到标签s。这是为了确保所有的点都被替换

sed不适用于同一行中的多个<Value>标记,而基本和扩展正则表达式不支持非贪婪匹配。我建议使用perl或一些支持XML的工具。