Intereting Posts

SED заменить после игнорирования

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

 bash-3.2$ grep online test.txt # online = false --> ONE SHOT import (delete all table contents before importing) # online = true --> DIFFERENTIAL import (import without clean the table contents) online = true 

Я попробовал это

 sed -i.bak '/DIFFERENTIAL\|/ONE SHOT\/!s/online.*/online = false/g' 

но он дал эту ошибку:

 sed: -e expression #1, char 17: unknown command: `O' 

Я не хочу, чтобы первые две строки менялись, только третий online = true чтобы стать online = false . Он может быть в любом месте файла, но он будет соответствовать online = . Поэтому я бы хотел, чтобы моя команда игнорировала 1 и 2 и меняла только 3.

Если вы хотите изменить строки, начинающиеся с online , возможно, это проще всего сделать:

 sed 's/^online\ *=.*/online = false/g' 

Таким образом, строки, начинающиеся с # , полностью игнорируются.

Еще более простая (но не идентичная) альтернатива, предложенная @mikeserv:

 sed '/^online/s/true/false/' 

Через awk :

 awk '/online =/{c++} c==3{gsub("true","false")}1' test.txt 

Это будет соответствовать всем вхождениям online = и увеличивать флаг счетчика c++ ; Когда найдено 3 события c==3 , замените true на false .