Вот пара. awk
каждый - просто решение Joseph, но записанный более кратким способом. Все они полагаются на ту же основную идею. Просто установите переменную на 1, когда подобранная строка найдена, и проверьте, что значение переменной для решения, что распечатать.
awk
awk '/END_OF_LINE/{ m = 1}(m==0){print $4,$5,$6; next}1;' file.txt
Perl
perl -alne '$m++ if /END_OF_LINE/; $m==0? print "@F[3..5]" : print; ' file.txt
Волшебство находится в perl
опции:
- повороты на режиме авторазделения при использовании с-n или-p. Неявная команда разделения к массиву @F сделана как первая вещь в неявном цикле с условием продолжения, произведенном-n или-p.
Это заставляет его действовать по существу как awk
. -n
просто средства обрабатывают входной файл линию за линией и -l
средства добавляют новую строку к каждому оператору печати (это означает намного больше, но это - то, что это делает здесь). Наконец, -e
просто способ передать сценарий командной строке.
Другой способ записи этого шаблона - [1127295][[:print:]][1127296]. Однако, это соответствует всем символам для печати в текущей локали (на основе настройки [1127297]LC_CTYPE[1127298]), так что это не лучше, чем [1127299][ -~][1127300] для вашего варианта использования. Также он может не работать, если ваше приложение или системная библиотека слишком устарели для понимания синтаксиса [1127301][:class:][1127302]. Синтаксис
is[1127314] set; по умолчанию [1127315]patterns=regex[1127316], что требует записи [1127317]^[ -~]*$[1127318] вместо этого.[1126761].