【问题标题】:Conditional find / replace in bash shellbash shell 中的条件查找/替换
【发布时间】:2016-04-21 04:15:10
【问题描述】:

我的问题应该很简单,我猜我失败的地方与语法有关。我正在寻找一个简单的 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 字符串 ">-*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=">-*

【问题讨论】:

    标签: regex xml bash shell sed


    【解决方案1】:
    >-[0-9]+<
    

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

    【讨论】:

    • 是否存在 >-.*
    • 是的,如果您的文件中包含任何其他 xml,其文本以破折号开头。
    • 当然。在这个特定的例子中,xml 文件中只会有数值,所以我应该是安全的,但要注意一点。谢谢
    【解决方案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>
    

    【讨论】:

    • 感谢@bobo 的回复。是的,这绝对可以。我现在的代码工作正常。再次感谢您抽出宝贵时间回复。
    【解决方案3】:

    试试这个:

    STRING=">-.*<"
    

    或者更好:

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

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

    【讨论】:

    • 感谢@jomuel 的回复。你很准。 “-xq”选项也让我很困惑。我只用“-q”替换了它,它工作正常。我现在会接受您的回答,再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-12-22
    • 2011-05-27
    • 2014-09-19
    • 1970-01-01
    • 2019-01-23
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多