2015-09-19 75 views
0

我能夠在文件中替換,但使用awk命令無法正確添加增量值(添加行號),並且還需要爲所有文件一個目錄。查找並替換目錄中所有文件中增量值的字符串

awk '{ sub(/ID>NA/,"ID>NA"++n); print }' file1 >file1 

file.xml

<ID>NA</ID> 
<Subject>ASDF</Subject> 
... 
<ID>NA</ID> 
<Subject>ASDF</Subject> 
... 
<ID>NA</ID> 
<Subject>ASDF</Subject> 
... 
<ID>NA</ID> 
<Subject>ASDF</Subject> 

預期的結果是:

file1.xml

<ID>NA1</ID> 
<Subject>ASDF</Subject> 
... 
<ID>NA2</ID> 
<Subject>ASDF</Subject> 
... 
<ID>NA3</ID> 
<Subject>ASDF</Subject> 
... 
<ID>NA4</ID> 
<Subject>ASDF</Subject> 
+0

請將所有'...'行替換爲實際樣本數據,以便您有我們可以測試的潛在解決方案。因爲shell在執行'command file'部分之前可以執行'> file'部分,所以在'command'打開它之前它將覆蓋'file',以便讀取。改爲執行'command file> tmp && mv tmp file'。你說你想添加行號,但你的命令和預期的輸出不這樣做,他們添加「NA」的實例號 - 你想要哪個? –

回答

1

這可能是你想要什麼:

for file in * 
do 
    awk '{ sub(/ID>NA/,"ID>NA"++n); print }' "$file" > tmp && 
    mv tmp "$file" 
done 

但它不是100%清楚你的問題。隨着GNU AWK 4 *你可以簡寫以上:

awk -i inplace '{ sub(/ID>NA/,"ID>NA"++n); print }' "$file" 
+0

謝謝埃德和約翰,它使用awk'/ VehicleID> NA/{sub(/ VehicleID> NA /,「VehicleID> NA」++ n)}爲默認值'NA'工作。 1'如預期。 awk -i inplace不起作用。我認爲我們的系統沒有正確的版本。是否可以根據ID元素中的動態值來搜索和替換增量值?其實我知道NA不是默認值。 – Ram

+0

您可以編寫代碼來做任何你想做的事情,但是你必須編輯你的問題,用樣本輸入和預期輸出來陳述你的新需求。對您而言,重新開始一個新問題可能是最好的。 –

1

你被遞增n每行。從示例輸出中看來,您只想在進行替換的行上增加n。在這種情況下:

$ awk '/ID>NA/{ sub(/ID>NA/,"ID>NA"++n)}; 1' file1.xml 
<ID>NA1</ID> 
<Subject>ASDF</Subject> 
... 
<ID>NA2</ID> 
<Subject>ASDF</Subject> 
... 
<ID>NA3</ID> 
<Subject>ASDF</Subject> 
... 
<ID>NA4</ID> 
<Subject>ASDF</Subject> 

此外,awk ... file > file不適合到位更改文件的工作。使用

$ awk '/ID>NA/{ sub(/ID>NA/,"ID>NA"++n)}; 1' file1.xml >tmp && mv tmp file1.xml 

對於GNU awk,這可以簡化。要立即更改目錄中的所有xml文件:

awk -i inplace '/ID>NA/{ sub(/ID>NA/,"ID>NA"++n)}; 1' *.xml 
相關問題