2012-06-29 2 views
0

У меня возникла следующая проблема: я хочу пройти все файлы xml в определенном каталоге и префикс всех id-s, которые я нахожу с определенным префиксом. Я написал следующий скрипт, чтобы сделать это:Как изменить содержимое файла с помощью find и awk?

#!/bin/bash 
find . -iregex .+?\.xml -print -exec awk '{print gensub(/(.*?)=\"(@(\+|)id)\/(.+)\"/, "\\1=\"\\2/prefix_\\4\"", "g", $1);}' {} > {} \; 

Однако Перенаправление часть - > {} не будет работать. Скрипт будет работать нормально и напечатать все, как ожидалось, на stdout, но кажется, что вывод не может быть перенаправлен на тот же файл, который awk читает. Любая идея, как обойти это? Благодаря!

+0

Чтобы уточнить, хотите ли вы читать из файла при записи в файл в то же время *? – Levon

+0

Нет. Я ожидаю 'awk print ... {}' для вывода чего-то, что будет перенаправлено на файл, который awk читает. Кажется, это невозможно. – asenovm

ответ

0

Exec это Баш вместо:

find . -iregex .+\.xml -print \ 
-exec bash -c "awk '{print gensub(/(.*?)=\\"(@(\+|)id)\/(.+)\\"/, \"\\1=\"\\2/prefix_\\4\\"\", \"g\", \$1);}' {} > {}.NEW" \; 

Это будет полностью перезаписать файл, который вы читаете из, хотя (и именно поэтому я добавил .NEW в файл, который я перенаправляет к). Возможно, вам нужен был редиректор(append)?


Это очень сложно найти полный рабочий пример, так как вы не представили примерный файл в своем вопросе. Однако, следующие работы:

Если у вас есть файл с именем tmp.xml, который содержит следующее:

I have a " 
I do not 

, а затем запустить:

find . -name '111.xml' -exec bash -c "awk '\$0 ~ /\"/ { print \$0 }' {} > {}.NEW" \; 

файл tmp.xml.NEW будет содержать:

I have a " 

Обратите внимание, что в дополнение к двойным кавычкам, yo вам нужно сэкономить ваши доллары ($) в вашем скрипте, так как оболочка рассматривает их как переменные.

+0

Это не работает даже после надлежащего экранирования. Я работал над этим, используя третий файл для перенаправления на выход и последующую копию, но я не очень доволен этим. Есть ли способ лучше? – asenovm

+0

@asenovm Посмотреть мои правки. –

Смежные вопросы