изменить строку с помощью awk - PullRequest
9 голосов
/ 29 февраля 2012

Я пытаюсь заменить одну строку в файле с помощью awk, например

, изменив это:

e1 is (on)

e2 is (off)

на:

e1 is (on)

e2 is (on)

используйте команду:

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba

это делает подстановку, но файл заканчивается пустым!

Ответы [ 5 ]

20 голосов
/ 29 февраля 2012

Другой ответ, используя другой инструмент (sed и флаг -i (на месте))

sed -i '/e2/ s/off/on/' ~/Documents/Prueba
20 голосов
/ 29 февраля 2012

Ваш awk верен, но вы перенаправляете на тот же файл, что и оригинал. Это приводит к тому, что исходный файл будет перезаписан до того, как он будет прочитан. Вам нужно будет перенаправить вывод в другой файл.

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba > ~/Documents/Prueba.new

При необходимости переименуйте Prueba.new.

3 голосов
/ 17 декабря 2014

Вы также можете использовать cat, чтобы сначала прочитать файл, затем использовать pipe, чтобы перенаправить на стандартный вывод, затем прочитать с awk из стандартного ввода:

cat ~/Documents/Prueba | awk '/e2/{gsub(/off/, "on")};{print}' - > ~/Documents/Prueba

Я считаю, что тире - не является обязательным, поскольку вы только читаете стандартный ввод.

Некоторые интересные документы: https://www.gnu.org/software/gawk/manual/html_node/Naming-Standard-Input.html

2 голосов
/ 23 мая 2017

Как объясняется другими ответами и вопросом " Почему чтение и запись одного и того же файла через перенаправление ввода-вывода приводит к пустому файлу в Unix? ", перенаправления оболочки уничтожают ваш входной файл доон читается.

Чтобы решить эту проблему без явного обращения к временным файлам, взгляните на команду sponge из коллекции moreutils .

awk '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba | sponge ~/Documents/Prueba

В качестве альтернативы, если в вашей системе установлен GNU awk, вы можете использовать расширение вместо .

gawk -i inplace '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba
0 голосов
/ 29 февраля 2012

Нельзя перенаправить на тот же файл, что и входной файл.Выберите другое имя файла.

> очистит ваш файл с первого места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...