2012-09-07 114 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