Вопрос: Почему шаблон регулярного выражения awk /\<aa\>/
соответствует строке типа: "aa.bbb"?
Мы можем быстро проверить это с помощью :
$ echo aa.bbb | awk '/\<aa\>/'
aa.bbb
Ответ можно найти в руководстве gnu awk:
3,7 gawk-Specifi c Операторы регулярных выражений
Программное обеспечение GNU, которое работает с регулярными выражениями, предоставляет ряд дополнительных операторов регулярных выражений. Эти операторы описаны в этом разделе и задаются c для gawk; они не доступны в других реализациях awk. Большинство дополнительных операторов имеют дело с сопоставлением слов. Для наших целей слово - это последовательность из одной или нескольких букв, цифр или символов подчеркивания ('_') :
\<
: Соответствует пустой строке в начале слова . Например, /\<away/
соответствует "away"
, но не "stowaway"
. \>
: Соответствует пустой строке в конце слова . Например, /stow\>/
соответствует "stow"
, но не "stowaway"
.
источник: Руководство по GNU awk: Раздел 3 :: Регулярные выражения
Итак, чтобы вернуться к приведенному выше примеру, строка «aa.bbb» содержит два слова «aa» и «bbb», поскольку -характер не является частью набора символов, который может составить слово . Здесь сравниваются пустые строки: пустая строка перед «aa.bbb» и пустая строка между символами a
и .
(пустая строка на самом деле является пустой строкой длиной 0, 0 символов, обычно записывается как ""
)
Решение ОП: Поскольку FS
, скорее всего, является значением по умолчанию, поле $3
не может содержать пробел. Поэтому возможны следующие два решения:
$3 ~ /^aa$/
$3 == "aa"
Если в коде определен разделитель полей FS
, может работать следующее
" "$3" " ~ /" aa "/
$3 ~ /(^|[ ])aa([ ]|$) # See solution of JHNC