awk + добавлять строки перед захваченным словом, только если строки не определены в файле

Следующий синтаксис awk добавит 3 строки в файле перед строкой со словом – DatePattern:

 $ awk 'done != 1 && /DatePattern/ { print "log4j.appender.DRFA=org.apache.log4j.RollingFileAppender" print "log4j.appender.DRFA.MaxBackupIndex=100" print "log4j.appender.DRFA.MaxFileSize=10MB" done = 1 } 1' file >newfile && mv newfile file 

проблема в том, что awk не волнует, существуют ли уже строки, так что нужно добавить в awk , чтобы вставлять строки, только если строки еще не присутствуют?

Другой пример

В этом случае мы хотим добавить перед строкой со словом «HOTEL» имена «trump», «bush» и «putin», но только в том случае, если имена не существуют:

 $ awk 'done != 1 && /HOTEL/ { print "trump" print "bush" print "putin" done = 1 } 1' file >newfile && mv newfile file 

2 Solutions collect form web for “awk + добавлять строки перед захваченным словом, только если строки не определены в файле”

Вы можете сделать это следующим образом:

 # store the 3 lines to match in shell variables line_1="log4j.appender.DRFA=org.apache.log4j.RollingFileAppender" line_2="log4j.appender.DRFA.MaxBackupIndex=100" line_3="log4j.appender.DRFA.MaxFileSize=10MB" # function that escapes it's first argument to make it palatable # for use in `sed` editor's `s///` command's left-hand side argument esc() { printf '%s\n' "$1" | sed -e 's:[][\/.^$*]:\\&:g' } # escape the lines line_1_esc=$(esc "$line_1") line_2_esc=$(esc "$line_2") line_3_esc=$(esc "$line_3") # invoke `sed` and fill up the pattern space with 4 lines (rather than the default 1) # then apply the regex to detect the presence of the lines 1/2/3. sed -e ' 1N;2N;$!N '"/^$line_1_esc\n$line_2_esc\n$line_3_esc\n.*DatePattern/"'!D :a;n;$!ba ' input.file 

Исходя из предположения, что порядок названий не имеет значения, и они будут встречаться всегда в пакете из трех, попробуйте

 awk ' BEGIN {INSTXT = "trump" ORS "bush" ORS "putin" for (n = split (INSTXT, T, ORS); n; n--) PRES[T[n]] } !(LAST in PRES) && /HOTEL/ {print INSTXT } {LAST = $0 } 1 ' file 
Interesting Posts

Solaris 8 запускается в режиме консоли

Почему у моего файла есть несколько записей crtime?

В чем разница между «cat file» ./binary "и" ./binary <файл "?

Как я могу исправить следующую ошибку зависимости библиотеки gmp при попытке установить Charm?

Извлечение архива путем компоновки содержимого архива в команду tar

Применить изменения с .Xdefaults на запуск терминалов rxvt

sed предотвращает удаление остальной линии

Как заставить текстовую консоль Fedora 28 устанавливать под KVM, чтобы не запрашивать текстовый режим против VNC

iconv перевод английского на русский язык

Как можно регистрировать активность в папке Dropbox?

Как я могу написать dmesg из командной строки?

Как получить информацию о версии пакета opkg без его установки?

Что означает эта запись iptables?

Не удается остановить Kerberos на debian 8

Что такое эквивалент samba для команды Windows «Просмотр сведений учетной записи пользователя» NET USER

Linux и Unix - лучшая ОС в мире.