Я всегда утверждал, что вы никогда не должны использовать выражение диапазона, например:
/start/,/end/
в awk, потому что хотя он делает тривиальный случай, когда вы хотите распечатать соответствующий текст, включая начальную и конечную строки, немного более краткими, чем альтернатива *:
/start/{f=1} f{print; if (/end/) f=0}
когда вы хотите немного настроить его, чтобы сделать что-либо еще, для этого требуется полная перезапись или результат в дублированном или иначе нежелательном коде. например если вы хотите напечатать соответствующий текст, исключая разделители диапазонов, используя вторую форму выше, вы просто подберете ее, чтобы переместить компоненты вокруг:
f{if (/end/) f=0; else print} /start/{f=1}
но если вы начали с /start/,/end/
, вам нужно отказаться от этого подхода в пользу того, что я только что написал, или вам нужно написать что-то вроде:
/start/,/end/{ if (!/start|end/) print }
то есть. дублируйте условия, которые нежелательны.
Затем я увидел вопрос, который потребовал идентифицировать LAST end
в файле и где в решении было использовано выражение диапазона, и я подумал, что это может иметь какое-то значение (см. qaru.site/info/449989/...).
Теперь, однако, я снова думаю, что это просто не стоит беспокоиться о выражениях диапазона вообще, и решение, которое не использует выражения диапазона, могло бы работать так же хорошо для этого случая.
Итак, есть ли у кого-нибудь пример, где выражение диапазона действительно добавляет заметное значение в решение?
* Раньше я использовал:
/start/{f=1} f; /end/{f=0}
но слишком много раз я обнаружил, что мне нужно было сделать что-то дополнительное, когда f
истинно и /end/
найдено (или, если поместить его другим способом, ТОЛЬКО что-то делать, когда /end/
найдено IF f
). поэтому теперь я просто стараюсь придерживаться чуть менее коротких, но гораздо более надежных и расширяемых:
/start/{f=1} f{print; if (/end/) f=0}