Удалите 'N' без строк только при N-м вхождении шаблона в файл с помощью команды sed / awk

Я использую приведенную ниже команду «sed», чтобы удалить «N» нет строк после каждого совпадения шаблона в файле.

sed -i '/test/,+1d' file.txt

Предположим, у меня есть шаблон 'test' в файле file.txt. И я хочу удалить 2 строки только после второго появления слова «тест». Есть ли для этого один вкладыш sed / awk?

Пример: file.txt

test
apple
mango
test
brinjal
carrot
test
banana
gauva
2
задан 6 January 2018 в 09:36

1 ответ

Удалить второе test и строка, которая следует за ним:

$ awk '/test/ && ++f == 2 {getline;next} 1' file.txt
test
apple
mango
carrot
test
banana
gauva

Как это работает:

  1. /test/ && ++f == 2 {getline;next}

    Каждый раз мы встречаем строку, соответствующую regex test, мы увеличиваем переменную f и, если f==2, мы читаем в другой строке с getline и затем переход для запуска на next строка. Это имеет эффект отбрасывания обоих test строка и следующая строка.

  2. 1

    Для всех других строк мы печатаем строку. (1 awk сокращение от печати строки.)

Альтернатива

В этом подходе мы получаем номер строки второго возникновения соответствия строки test в переменной N.

Мы печатаем строку только если N еще не присвоен или иначе если текущая строка является по крайней мере 2 строками после номера строки N.

$ awk '/test/ && ++f == 2 {N=NR} (!N) || NR>=N+2' file.txt
test
apple
mango
carrot
test
banana
gauva
3
ответ дан 2 December 2019 в 02:44

Другие вопросы по тегам:

Похожие вопросы: