我尝试使用以下方法从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
答案 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
,... tdel
命令更改了行,则:del
会跳转到标签s
。这是为了确保所有的点都被替换此sed
不适用于同一行中的多个<Value>
标记,而基本和扩展正则表达式不支持非贪婪匹配。我建议使用perl
或一些支持XML的工具。