
Я пытаюсь выполнить 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 '^[<>]'