изменить строку с 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
вы не можете перенаправить в тот же файл, что и входной файл. Выберите другое имя файла.
на >
будет пустой файл на первом месте.