Проблема OP была вызвана файловым файлом, использующимCR
(\r
/ ascii 13 )вместоLF
(\n
/ ascii 10 )в качестве разделителей строк, как ожидалось sed
. Использование CR
было соглашением, используемым в классической MacOS; как пользователь, не являющийся пользователем Mac, единственное его использование, с которым я встречался в дикой природе за последние два десятилетия, было в файлах PDF,где это сильно усложняет любой наивный синтаксический анализатор PDF, написанный вperl
(в отличие от RS
в mawk
и gawk
, $/
в perl
не может быть регулярным выражением ).
Что касается вопроса из заголовка, да, awk
поддерживает шаблоны диапазонов, и вы можете свободно смешивать в них регулярные выражения и предикаты номеров строк (или любое выражение ). Например:
NR==1,/rex/ # all lines from the 1rst up to (and including)
# the one matching /rex/
/rex/,0 # from the line matching /rex/ up to the end-of-file.
Диапазоныawk
отличаются от диапазонов sed
, потому что в awk
конечный предикат также может соответствовать строке, с которой начинается диапазон. Поведение sed
можно эмулировать с помощью:
s=/start/, !s && /last/ { s = 0; print }
Однако диапазоны в awk
по-прежнему довольно ограничены, поскольку они не являются реальным выражением (, их нельзя инвертировать, сделать частью других выражений, использовать в if(...)
и т. д. ). Кроме того, нет никакой магии :, если вы хотите выразить что-то вроде диапазона с «контекстом» (, например./start/-4,/end/+4
)вам придется свернуть собственный кольцевой буфер и дополнительную логику.