awk sub () не выполняет замену - PullRequest
0 голосов
/ 12 марта 2020

Пример текстового файла.

Файл in2.txt:

*{commented out line}* KeyWordName = KeyWordValueAA  
KeyWordName = KeyWordValueAA

Регулярное выражение находит строку:

awk '/^KeyWordName[[:blank:]]=[[:blank:]].*$/' in2.txt

Вывод:

KeyWordName = KeyWordValueAA

Команда, которая приводит к без ошибок или измененного текста:

awk '{sub(/^KeyWordName[[:blank:]]=[[:blank:]].*$/, "KeyWordValueBB")}' in2.txt

Удаление двойных кавычек также не работает. Чтение руководства также не помогло.

1 Ответ

1 голос
/ 12 марта 2020

Вам нужно явно распечатать, чтобы увидеть любой вывод:

Обычная идиома awk - добавить 1 после действия:

$ awk '{sub(/^KeyWordName[[:blank:]]=[[:blank:]].*$/, "KeyWordValueBB")}1' file
{commented out line} KeyWordName = KeyWordValueAA
KeyWordValueBB

1 всегда и, поскольку соответствующего действия нет, выполняется действие по умолчанию print (для всех строк ввода).

Или вы можете просто использовать print:

$ awk '{sub(/^KeyWordName[[:blank:]]=[[:blank:]].*$/, "KeyWordValueBB")} {print}' file
{commented out line} KeyWordName = KeyWordValueAA
KeyWordValueBB

Чтобы изменить файл, когда у вас нет опции -i, сохраните его во временный файл и переименуйте его в свой файл (в любом случае это то, что -i делает для вас). Используя &&, мы уверены, что команда mv будет выполнена только в случае успешного завершения awk. Тем не менее, вы можете сначала сохранить копию исходного файла на случай, если awk "успешен" с точки зрения ОС, но не выполняет то, что вы ожидали!

awk '{ ... }' file > tmp && mv tmp file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...