2015-09-19 2 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

Пожалуйста, замените все строки '...' фактическими данными образца, чтобы у вас было что-то, с чем мы могли бы протестировать потенциальное решение. Вы никогда НЕ должны делать 'command file> file', так как оболочка может выполнить' 'файл' 'перед выполнением части' command file', и если это будет перезаписывать 'файл', перед' command' открывает его для чтения. Вместо этого сделайте 'командный файл> 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

Спасибо Эд и Джон, он работает по умолчанию «NA», используя awk '/ VehicleID> NA/{sub (/ VehicleID> NA /, "VehicleID> NA" ++ n)}; 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 
Смежные вопросы