Определение полного спектра печатаемых символов ASCII в шаблоне шарика

Вот пара. awk каждый - просто решение Joseph, но записанный более кратким способом. Все они полагаются на ту же основную идею. Просто установите переменную на 1, когда подобранная строка найдена, и проверьте, что значение переменной для решения, что распечатать.

  1. awk

    awk '/END_OF_LINE/{ m = 1}(m==0){print $4,$5,$6; next}1;' file.txt 
    
  2. 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 просто способ передать сценарий командной строке.

2
07.04.2014, 09:37
1 ответ
[1126756] Образец глобуса или регулярное выражение [1127291][ -~] [1127292] соответствует всем символам, выводимым на печать в Си-локации: это соответствует всем символам от 32 (пробел) до 126 (тильда). В локали, отличной от C (точнее, если [1127293]LC_COLLATE[1127294] не C), если приложение локально, то это может совпадать с другими символами.

Другой способ записи этого шаблона - [1127295][[:print:]][1127296]. Однако, это соответствует всем символам для печати в текущей локали (на основе настройки [1127297]LC_CTYPE[1127298]), так что это не лучше, чем [1127299][ -~][1127300] для вашего варианта использования. Также он может не работать, если ваше приложение или системная библиотека слишком устарели для понимания синтаксиса [1127301][:class:][1127302]. Синтаксис

Super's [1127303][[[1127665]cHARS[112766]]][1127304] (если установлена глобальная опция [1127305]patterns=shell[1127306]) следует тому же принципу, поэтому [1127307][[ -~]][1127308] означает "только печатаемые ASCII-символы". Супер не устанавливает никакой другой локали, кроме [1127309]LC_CTYPE[1127310], так что вы в безопасности с этого фронта. Убедитесь, что [1127311]patterns=shell

is[1127314] set; по умолчанию [1127315]patterns=regex[1127316], что требует записи [1127317]^[ -~]*$[1127318] вместо этого.[1126761].
2
27.01.2020, 22:13

Теги

Похожие вопросы