Мне неясно, что вы хотите сделать, но я предполагаю, что вы хотите удалить пару строк, если первая строка соответствует Pattern1
, а вторая соответствует Pattern2
или если первая строка соответствует Pattern3
и второй матч Pattern4
. Если это так, у вас должно работать следующее:
#!/bin/sh
cat <<\EOF |
Mary
John
Doe
Simon
Henry
EOF
sed -n -e 'H; ${ g
# append a newline to correctly match at the end of the file
s/$/\n/
# delete instances of John\nDoe
s/\nJohn\nDoe\n/\n/g
# delete instances of Mary\n<blank>
s/\nMary\n\n/\n/g
# remove the newlines added at the beginning and end
s/\n\(.*\)\n/\1/
# print the result
p
}'
# output:
# Simon
# Henry
Приведенный выше скрипт sed использует H
вместо 1h; 1!H
для получения новой строки в начале шаблона. Это также добавляет новую строку в конце. Это позволяет искать \nPattern1\nPattern2\n
вместо Pattern1\nPattern2
. Это предотвращает плохие совпадения: поиск «Anne Doe» не должен найти «MaryAnne Doe», а поиск «John Clark» не должен искать «John Clarkson».