#awk
Вопрос:
Я только что заметил новую установку, которую Ubuntu не gawk
установила по умолчанию.
Поэтому все мои выражения awk, содержащие маркеры границ слов:»lt;»,»gt;», вообще не работают, пример:
$ readlink -e $(which awk) /usr/bin/mawk $ echo "word1 Bluetooth word3" | awk '/lt;Bluetoothgt;/' $
EDIT0 : В другой системе, где gawk
установлен, он работает :
$ readlink -e $(which awk) /usr/bin/gawk $ echo "word1 Bluetooth word3" | awk '/lt;Bluetoothgt;/' word1 Bluetooth word3 $
EDIT1 : Более mawk
того, показывает странное поведение :
$ echo word1 word2 word3 | mawk '/^w /{print$1}' word1 $ echo sebastien1 abc toto | mawk '/^w /{print$1}'
Вот некоторые из последовательностей побегов gawk
. :
$ man gawk | grep '\[yswSWlt;gt;].*Matches' y Matches the empty string at either the beginning or the lt; Matches the empty string at the beginning of a word. gt; Matches the empty string at the end of a word. s Matches any whitespace character. S Matches any nonwhitespace character. w Matches any word-constituent character (letter, digit, or W Matches any character that is not word-constituent.
EDIT2 : Ed Morton
верно, mawk
не понимает w
ни другие последовательности espaces, которые gawk
понимают :
$ man mawk | grep '\[yswSWlt;gt;]' $
Есть ли способ подбора слов, который подходит для обоих mawk
и gawk
?
Ответ №1:
Зависит от того, что вы хотите сделать с матчем, но этого может быть достаточно:
$ echo "word1 Bluetooth word3" | awk '/(^|[^[:alnum:]_])Bluetooth([^[:alnum:]_]|$)/' word1 Bluetooth word3
Во всех awk или даже только в POSIX awk нет общей escape-последовательности, которая означает «граница слов».
Если это не все, что вам нужно, отредактируйте свой вопрос, чтобы лучше объяснить, что вы хотите сделать с соответствующей строкой, и предоставьте пример ввода/вывода, демонстрирующий это использование.
Что касается вашей правки — mawk не проявляет странного поведения. Вы просите его найти строку, которая начинается с 1 или более w
s ( w
является буквальным символом, а w
также все тем же буквальным символом), и распечатать первое поле из этой строки. Первая строка , с которой вы тестируете, начинается с w
, вторая-нет.
Если вы пытаетесь сопоставить символы, составляющие слова (что w
и было бы сделано в gawk), затем используйте [[:alnum:]_]
в POSIX awk или [a-zA-Z0-9_]
в любом awk, предполагая, что эти диапазоны символов соответствуют вашей локали. Если бы вы хотели напечатать слово, соответствующее этому регулярному выражению, то это было бы:
$ echo 'sebastien1 abc toto' | awk 'match($0,/^[[:alnum:]_] /){print substr($0,RSTART,RLENGTH)}' sebastien1
Комментарии:
1. Спасибо за ваш ответ. Не могли бы вы взглянуть на мое РЕДАКТИРОВАНИЕ 0 ?
2. Большое спасибо за разъяснение. Я знаю, что это не по теме, но есть ли у вас какие-либо идеи, почему Ubuntu выбрала версию GNU
grep
, но не версию GNUawk
, установленную по умолчанию в их системе ?3. @SebMa — всегда пожалуйста. Понятия не имею, извини.