Grep инвертирует совпадение с контекстом

Grep инвертирует совпадение с контекстом

Я пытаюсь выполнить grep файла с обратным соответствием, но при этом не сопоставлять каждую строку, следующую сразу за совпадающими строками.

Итак, у меня есть следующее содержимое в файле с именем testing_grep:

aaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbb
cccccccccccccccccc
dddddddddddddddddd
llllllllllllllllll
dddddddddddddddddd
llllllllllllllllll
fffffffffffffffff
fffffffffffffffff

Итак, я хочу сопоставить все строки, кроме тех, которые содержат dтакое совпадение, и следующей строки после него, поэтому у меня есть следующая grepкоманда:

 grep -v "d" -A 1 testing_grep.txt 

Однако я по-прежнему получаю все строки, хотя мне нужен только следующий вывод:

aaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbb
cccccccccccccccccc
fffffffffffffffff
fffffffffffffffff

Спасибо за любую помощь.

решение1

Попробуйте сделать это с помощью GNU sed:

В пространстве шаблонов (текущая строка) найти ( //) строку, содержащую d. Только для этих строк добавить следующую строку ввода в пространство шаблонов ( N) и удалить пространство шаблонов ( d).

sed '/d/{N;d;}' testing_grep.txt

Выход:

ааааааааааааааааа
bbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbb
cccccccccccccccc
фффффффффффффффф
фффффффффффффффф

решение2

Сайрус уже дал вам идеальный ответ, но если вы хотите сделать это с помощью grep (что сложнее),

вы выбираете ненужные строки и помещаете их в файл:

grep 'd' -A 1 testing_grep.txt > otherfile.txt

Содержимое файла otherfile.txt будет следующим: dddddddddddddddddd llllllllllllllllll dddddddddddddddddd llllllllllllllllll

Затем используйте команду diff, чтобы получить разницу:

diff testing_grep.txt otherfile.txt | grep '^[<>]'

Связанный контент