我的问题应该相当简单,而且我猜测我失败的地方与语法有关。我正在寻找一个简单的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; ... 。 任何指向正确方向的人都会非常感激。提前谢谢。
答案 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]+<
是一个更好的选择,因为它是一个或多个字符