繁体   English   中英

在bash shell中有条件地查找/替换

[英]Conditional find / replace in bash shell

我的问题应该很简单,我猜我失败的地方与语法有关。 我正在寻找一个简单的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 =“>-* <” ....朝正确方向的任何指针将不胜感激。 提前致谢。

尝试这个:

STRING=">-.*<"

或更好:

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

通常,*表示“最后一个字符/字符类的任何数目”,因此。*匹配任何字符串,[0-9] *匹配仅由数字组成的任何字符串。 您的表达式将与'> <','>-<','>-<','> --- <'等匹配。

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-9]+<

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM