我的问题应该很简单,我猜我失败的地方与语法有关。我希望编写一个简单的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>
我对此的想法是,如果我在文件中对字符串">-*<“的任何实例进行处理,并使用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=“>-*<”.任何指向正确方向的指示都将不胜感激。提前谢谢。
发布于 2016-01-15 06:45:29
试试这个:
STRING=">-.*<"
或者更好的是:
STRING=">-[0-9]*<"
通常,*表示“最后一个字符/类的任意数目”,因此.*匹配任何字符串,0-9*任何仅由数字组成的字符串。您的表达式将匹配<‘>、'>-<’、‘>-等等.
发布于 2016-01-15 07:54:17
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>
发布于 2016-01-15 07:55:24
>-[0-9]+<
是一个更好的选择,因为它是一个或多个字符。
https://stackoverflow.com/questions/34813275
复制相似问题