Я использую приведенную ниже команду «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
Удалить второе test
и строка, которая следует за ним:
$ awk '/test/ && ++f == 2 {getline;next} 1' file.txt
test
apple
mango
carrot
test
banana
gauva
Как это работает:
/test/ && ++f == 2 {getline;next}
Каждый раз мы встречаем строку, соответствующую regex test
, мы увеличиваем переменную f
и, если f==2
, мы читаем в другой строке с getline
и затем переход для запуска на next
строка. Это имеет эффект отбрасывания обоих test
строка и следующая строка.
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