Почему бы просто не добавить еще одну переменную для использования в качестве переменной флага для управления печатью. (Например, prn=0
, затем, если найдено start
, установите prn=1
и напечатайте все строки, если prn=1
, затем выйдите, когда достигните finish
). Например, вы можете сделать следующее:
awk -v s="start" -v e="finish" -v prn=0 '
BEGIN { ORS="" }
$0~s { prn=1 }
prn==1 { printf "%s\n\n", $0 }
$0~e {exit}
' input
( примечание: было бы проще просто оставить ORS
в качестве новой строки)
Пример Использование / Вывод
Просто вставив в командную строку, вы получите:
$ awk -v s="start" -v e="finish" -v prn=0 '
> BEGIN { ORS="" }
> $0~s { prn=1 }
> prn==1 { printf "%s\n\n", $0 }
> $0~e {exit}
> ' input
start
1
2
3
finish
Что соответствует вашему выводу. (если вам действительно не нужны пустые строки, просто удалите одну из '\n'
в операторе printf
)
Чтобы найти все start
И finish
Просто сбросьте prn
Отметить ноль
Чтобы не exit
после первых finish
, но найти все start
до finish
случаев, вы сбрасываете prn=0
, например,
awk 'BEGIN { ORS=""; s="start"; e="finish"; prn=0 }
$0~s { prn=1 }
prn==1 { printf "%s\n\n", $0 }
$0~e { prn=0 }
' input
( примечание: выше, я объединил установку всех переменных в правиле BEGIN
, поскольку вы все равно его используете)
Теперь все секции от start
до finish
будут выводиться вТочно так же.
Дайте мне знать, если вы просите что-то немного другое или у вас есть дополнительные вопросы.