![“while read”还输出未读取/编辑的内容](https://linux22.com/image/78965/%E2%80%9Cwhile%20read%E2%80%9D%E8%BF%98%E8%BE%93%E5%87%BA%E6%9C%AA%E8%AF%BB%E5%8F%96%2F%E7%BC%96%E8%BE%91%E7%9A%84%E5%86%85%E5%AE%B9.png)
我想要做的是编辑一个 xml 文件,并替换其中一个标签内的内容。这是我的脚本:
while read line; do
if [[ "$line" == *"<Valuec=\"0\">"* ]]
then
~/bin/nn4 Decrypt1 "$line" | sed 's/^/\<Valuec=\"0\"\>/g;s/$/\<\/Valuec\>/g'
fi
done <"$1"
nn4
删除标签,解密内容,然后sed
命令将标签放回原处。
这是输入
<string>
<Id>1</Id>
<file>file.txt</file>
<Valuec="0">982498as9adhfsdf</Valuec>
</string>
<string>
<Id>2</Id>
<strStringCaption>file2.txt</strStringCaption>
<Valuec="0">2389aHASDasd</Valuec>
</string>
但是,这当然只会输出已编辑的行。它看起来像这样:
<Valuec="0">decryptedstring</Valuec>
<Valuec="0">decryptedstring2</Valuec>
但是,我希望它看起来像这样:
<string>
<Id>1</Id>
<file>file.txt</file>
<Valuec="0">decryptedstring</Valuec>
</string>
<string>
<Id>2</Id>
<strStringCaption>file2.txt</strStringCaption>
<Valuec="0">decryptedstring2</Valuec>
</string>
答案1
else
只需在循环体中添加一个条件while
:
while IFS= read -r line; do
if [[ "$line" == *"<Valuec=\"0\">"* ]]
then
~/bin/nn4 Decrypt1 "$line" | sed 's/^/\<Valuec=\"0\"\>/g;s/$/\<\/Valuec\>/g'
else
printf '%s\n' "$line"
fi
done <"$1"
注意使用IFS= read -r
完整地阅读线。
无论如何,您应该考虑使用其他工具来完成此任务。在 shell 脚本中使用 while 循环被认为是不好的做法。