2015-09-19 50 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 
相关问题