Другое решение sed
потерпит неудачу, если firstmatch
встречается в 1-й строке 1 .
Будьте проще, используйте один диапазон и пустое 2 регулярное выражение:
либо печатать все в этом диапазоне, кроме концов диапазона (авто -печать отключена)3:
sed -n '/firstmatch/,/secondmatch/{//!p;}' infile
или, короче, удалить все, что не входит в этот диапазон, а также удалить концы диапазона:
sed '/firstmatch/,/secondmatch/!d;//d' infile
1 :Причина в том, что если второй адрес является регулярным выражением, то проверка конечного совпадения начнется со строки, следующей за строкой, совпавшей с первым адресом .
Следовательно, /firstmatch/
никогда не оценивается для 1-й строки ввода, sed
просто удалит его, поскольку он соответствует номеру строки в 1,/RE/
, и перейдет ко 2-й строке, где он проверит, соответствует ли строка/firstpattern/
3 :синтаксис ;}
предназначен для современных sed
реализаций; в более старых используйте либо новую строку вместо точки с запятой, либо отдельные выражения, например.sed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile