Я учусь awk
и хотел бы знать, есть ли возможность записывать изменения в файл, аналогично тому, sed
где я бы использовал -i
вариант для сохранения изменений в файл.
Я понимаю, что могу использовать перенаправление для записи изменений. Однако есть ли возможность awk
это сделать?
Ответы:
В последней версии GNU Awk (начиная с версии 4.1.0 ) есть возможность редактирования файла "на месте" :
Пример использования:
Чтобы сохранить резервную копию:
источник
inplace
на самом деле является библиотекой, включенной вgawk
соответствии с ответом iiSeymour , поэтомуinplace
это то, что может быть включено как файлincludefile
.Если у вас нет GNU awk 4.1.0 или новее ...
У вас не будет такой опции, как опция sed,
-i
поэтому вместо этого сделайте:Примечание:
-i
это не волшебство, он также создает временный файл, которыйsed
обрабатывает его за вас.Начиная с GNU awk 4.1.0 ...
GNU awk
добавлен этот функционал в версии 4.1.0 (выпущен 10.05.2013) . Это не так просто, как просто дать-i
возможность, как описано в выпущенных примечаниях:Для
inplace.awk
правильного вызова расширения вам необходимо использовать связанный включаемый файл:Переменная
INPLACE_SUFFIX
может использоваться для указания расширения для файла резервной копии:Я счастлив , эта функция была добавлена , но для меня, реализация не очень awkish как сила исходит от лаконичности языка и
-i inplace
8 символов слишком долго имо .Вот ссылка на мануал за официальным словом.
источник
awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file
:?awk '{print $0}' file | sponge file
пользовалсяsponge
отmoreutils
.@sudo_O имеет право ответ .
Это не может работать:
Оболочка выполняет перенаправления перед передачей управления некоторому процессу ( перенаправлениям ).
>
Перенаправление будет обрезает файл до нулевого размера ( выходной перенаправлении ). Следовательно, к тому времени, когда какой-то процесс запускается и хочет прочитать из файла, у него нет данных для чтения.источник
просто небольшой прием, который работает
источник
Альтернативой является использование
sponge
:Где вы заменяете
'{print $0}'
свой сценарий awk иyour_file
именем файла, который хотите отредактировать на месте.sponge
полностью поглощает ввод перед сохранением в файл.источник
sponge
является частьюmoreutils
. Так что в большинстве систем его не будет по умолчанию. Но похоже, что по крайней мереsponge
сам по себе достаточно портативен и может работать практически везде.tee
-based является то, чтоsponge
все данные будут считываться в ОЗУ перед записью, следовательно, большие файлы будут зависать.следующее не сработает
это должно работать
источник
Если вам нужно решение только для awk без создания временного файла и его можно использовать с версией! = (Gawk 4.1.0):
источник
Использование тройника
tee
команды имеют место и выполняются послеawk
завершения команды из - за|
.источник