2016-01-15 57 views
1

我的问题应该相当简单,我猜我失败的地方在于语法相关。我正在寻找编写一个简单的shell脚本,它通过以下方式操作XML文件。bash shell中的条件查找/替换

每个标签内的数据点将是数值。这些都应该是正面的,所以如果XML文件中任何标签内都存在负值,我想用零替换它。例如,下面的XML文件 - 称之为“file.xml”

<tag1>19</tag1> 
<tag2>2</tag2> 
<tag3>-12</tag3> 
<tag4>37</tag4> 
<tag5>-41</tag5> 

<tag1>19</tag1> 
<tag2>2</tag2> 
<tag3>0</tag3> 
<tag4>37</tag4> 
<tag5>0</tag5>  

我对这个问题的思考来代替将是如果我grepped字符串的任何实例“> - * <“,并使用sed将其替换为> 0 <,如下所示。

#!/bin/bash 
STRING=">-*<" 
if grep -xq "$STRING" file.xml 
then 
sed -i 's/$STRING/>0</g' file.xml 
else 
echo "that string was not found in the file" 
fi 

但是,所有我得到的回报是回声字符串“该字符串不是在文件中找到”返回,甚至尽管我已经在文件中包含负值。这个例子中的*号没有考虑任何字符串?自然,可以有任何减号后的数字,所以我想我的问题是我如何定义变量:STRING =“> - * <”.... 任何指针在正确的方向将不胜感激。提前致谢。

回答

2

试试这个:

STRING=">-.*<" 

或者更好。

STRING=">-[0-9]*<" 

在一般情况下,*意味着 '任何数量的最后一个字符/字符类的',所以*匹配任何字符串,[0-9] *任何只包含数字的字符串。你的表情会匹配'> <','> - <','> - <','> - <'等等。

+0

感谢@jomuel的回应。你在现场。 “-xq”选项也搅乱了我。我用“-q”代替了它,它工作正常。我现在接受你的回答,并再次感谢你的帮助。 – tasslebear

2
cat aaa.txt 
<tag1>19</tag1> 
<tag2>2</tag2> 
<tag3>-12</tag3> 
<tag4>37</tag4> 
<tag5>-41</tag5> 

零替换底片并写入新文件

sed 's/-[0-9][0-9]*/0/' aaa.txt > a2.txt 

检查新文件

cat a2.txt 
<tag1>19</tag1> 
<tag2>2</tag2> 
<tag3>0</tag3> 
<tag4>37</tag4> 
<tag5>0</tag5> 
+0

感谢您的回复@bobo。是的,这绝对工作正常。我现在的代码工作正常。再次感谢您花时间回复。 – tasslebear

1
>-[0-9]+< 

是一个更好的选择,因为它是一个或多个字符

+0

是否有任何实例存在> - 。* <可能失败? – tasslebear

+1

是的,如果您的文件中包含任何其他包含文本以破折号开头的xml。 –

+0

当然。在这个特定的实例中,在xml文件中只会有数字值,所以我应该是安全的,但请注意。谢谢 – tasslebear