изменить строку с awk

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

изменение этого:

e1 is (on)

e2 is (off)

в:

e1 is (on)

e2 is (on)

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

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

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

5 ответов


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

sed -i '/e2/ s/off/on/' ~/Documents/Prueba

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

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

Переименовать Prueba.новое потом, если необходимо.


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

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

Я верю в черте - является необязательным, так как Вы читаете только stdin.

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


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

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

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

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

gawk -i inplace '/e2/{gsub(/off/, "on")};{print}' ~/Documents/Prueba

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

на > будет пустой файл на первом месте.