Как использовать границы слов в awk без использования функции match ()? - PullRequest
3 голосов
/ 13 марта 2012

Я хочу добавить границы слов в эту команду awk:

awk '{$0=tolower($0)};/wordA/&&/wordB/ { print FILENAME ":" $0; }' myfile.txt

Я попытался добавить \y слева и справа от wordA и wordB, но это не сработало в моих тестах.
Я пробовал это: /\ywordA\y/&&/\ywordB\y/

Спасибо всем!

(ps: я новичок в awk, поэтому я пытался избежать функции match ().)

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

Вы хотите использовать gawk вместо awk:

gawk '{$0=tolower($0)};/\ywordA\y/&&/\ywordB\y/ { print FILENAME ":" $0; }' myfile.txt

будет делать то, что вы хотите, если ваша система имеет gawk (например, в Mac OS X).\ y является расширением GNU для awk.

1 голос
/ 20 января 2017
  1. GNU awk также поддерживает соглашения \< и \> для границ слов.
  2. На Mac версия / usr / bin / awk 20070501 не поддерживает [[: <:]] или [[:>:]]
  3. Если вы застряли с непокорным awk, то, поскольку awk в любом случае обычно разбивает строки на токены, возможно, имеет смысл использовать:

    function word(s, i) { for (i=1;i<=NF;i++) {if ($i ~ "^" s "$") {return i}}; return 0; }

Так, например, вместо записи

/\<[abc]\>/ { print "matched"; }

Вы могли бы так же легко написать:

word("[abc]") { print "matched"; }
0 голосов
/ 13 марта 2012

Это может работать для вас на Mac OS X :

awk '{$0=tolower($0)};/[[:<:]]wordA[[:>:]]/&&/[[:<:]]wordB[[:>:]]/ { print FILENAME ":" $0; }' myfile.txt

Но так как это не сработает в Linux, лучше всего установить GNU awk.

...