On 18.01.2013 19:11, Timofey Andreewski wrote:
On 01/18/2013 02:58 PM, Timofey Andreewski wrote:awk -v inIP=$1 '{gsub("EXTIP1.*", "EXTIP1=\""inIP"\"", $0); print > FILENAME}' testТут корень проблемы в print > FILENAME Ты построчно читаешь файл и туже в него пишешь. Пиши в другой файл. Я проверил - работает и на строке 22222222222222kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk В файле будет: EXTIP1="22222222222222kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" xxxxxxxxxxx bbbbbbbbbbb ccccccccccc xxxxxxxxxxx Это идеологически не правильно: весь модифицированный поток надо сохранять отдельно, и тогда некоректные выходы программы не повлекут за собой нарушения целостности исходных данных. Модифицирующий код отработает, проверяешь код завершения, и если OK, то заменяешь исходный файл с данными, временным. Я сходу так сделал : awk -v inIP=$1 '{ if (NR==1) OFILE=FILENAME".bak"; gsub("EXTIP1.*", "EXTIP1=\""inIP"\"", $0); print > OFILE; }' test && mv test.bak testДа проблем-то не в этом, а в том, что если я последовательно запускаю: ./awtest 13424 ./awtest 13426 ./awtest 13427 ./awtest 13428 ./awtest 13429 ./awtest 13430 все отлично работает а вот как только я после этого запускаю: ./awtest 134301 то скрипт тут же зависает в непреревном цикле. Откуда такое поведение-то? Почему удлиление строки-то так действует?
Правильный ответ: так делать нельзя, и нельзя такого хотеть. Следует вбить себе в голову, что делать надо правильно, и не пытаться получить корректность от хождения по граблям.
Объяснение: awk более длинной строкой перезатирает символ перевода строки в исходном файле, и читает на следующей итерации более длинную ту же строку (результат слепливания), заменяет её на такую, которая подпадает под тот же шаблон в виду повторения подстроки EXTIP1, снова заменяет, и т.д.
-- Vadim Goncharov <[email protected]> RU-Center NET Department http://www.nic.ru NET-SYS Group phone:+7(495)737-7646 (ext.4019)
