簡體   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