программа mawk не понимает маркеров границ слов : «» ни некоторые другие escape-последовательности

#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 , но не версию GNU awk , установленную по умолчанию в их системе ?

3. @SebMa — всегда пожалуйста. Понятия не имею, извини.