[英]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.