bash shell

时间:2016-01-15 14:30:17

标签: regex xml bash shell sed

我的问题应该相当简单,而且我猜测我失败的地方与语法有关。我正在寻找一个简单的shell脚本,它以下列方式操作XML文件。

每个标记内的数据点都是数值。这些都应该是正数,所以如果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字符串的任何实例&#34;&gt; - *&lt;&#34;在文件中并使用sed将其替换为&gt; 0&lt;如下。

#!/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

然而,我收到的所有信息都是回音字符串&#34;在文件中找不到该字符串&#34;被退回,即使我在文件中包含负值。 *不考虑此示例中减号后面的任何字符串吗?当然,减号后面可以有任何数字,所以我认为我的问题是我如何定义变量:STRING =&#34;&gt; - *&lt;&#34; ... 。 任何指向正确方向的人都会非常感激。提前谢谢。

3 个答案:

答案 0 :(得分:2)

试试这个:

STRING=">-.*<"

或更好:

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

通常,*表示“最后一个字符/字符类别的任意数量”,因此。*匹配任何字符串,[0-9] *任何仅由数字组成的字符串。您的表达式将匹配'&gt;&lt;','&gt; - &lt;','&gt; - &lt;','&gt; ---&lt;'等等。

答案 1 :(得分: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>

答案 2 :(得分:1)

>-[0-9]+<

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

相关问题