2012-09-07 154 views
2

我想穿过一些包含xml文件的目录。对于每个文件,我想应用awk命令并将输出再次写入文件。但是,写入的文件是空的。为什么?我使用下面的脚本:循环目录和文件bash脚本 - awk不写入文件

#!/bin/bash 
for f in `find /myDir/ -iname "*.xml"` 
do 
    awk '/<string name="my\/ attribute" optional="false">/,/<\/string>/ {sub(/<value>(.*)<\/value>/,"<value>none</value>")}1' $f >$f 
done 
+0

不要使用'for'循环,如果你的文件可能会包含空格。做到这一点:'找到... |而IFS =读-r f;做...;完成' –

回答

2

你必须使用一个临时文件:

awk ... "$f" > "$f".tmp; mv "$f".tmp "$f" 
+0

这工作得很好。另一个问题就是打击我。我如何处理包含空格的文件名?例如“我的文件名1.xml”。 – LaDude

+0

@Daniela:新问题应该单独发布。但在你做之前,请阅读你的shell手册或者搜索Stack Overflow。有很多很多地方都提到如何用空格处理文件名的问题。 – chepner

+0

好的。为此事道歉。 – LaDude

1

的问题是不是在awk,问题是在重定向。无法写入正在阅读的文件。

+0

为了充实细节,当shell看到输出重定向时,它首先**将该文件截断为零长度。 **然后**执行awk命令并在空文件上运行。您确实需要写入临时文件。 sed和perl的'-i'选项在后台执行。 –

+0

Thx的解释。现在这一切都有道理! – LaDude