Функция awk tolower не работает при сопоставлении более одного слова в строке - PullRequest
0 голосов
/ 12 марта 2012

У меня есть файл, увиденный здесь:

$ больше myfile.txt

Джек и Джилл пошли в гору.

У меня вопрос, почему tolower () не применяется ко второму слову 'jill', в данном случае:

$ awk 'tolower ($ 0) ~ / jack / && / jill / {print FILENAME ":" $ 0; } '* .txt

Следующая работа, но я хочу, чтобы все было в нижнем регистре.

$ awk 'tolower ($ 0) ~ / jack / {print FILENAME ":" $ 0; } '* .txt

myfile.txt: Джек и Джилл пошли в гору.

$ awk 'tolower ($ 0) ~ / jill / {print FILENAME ":" $ 0; } '* .txt

myfile.txt: Джек и Джилл пошли в гору.

$ awk 'tolower ($ 0) ~ / jack / && / Jill / {print FILENAME ":" $ 0; } '* .txt

myfile.txt: Джек и Джилл пошли в гору.

Спасибо!

Ответы [ 2 ]

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

Operator precedence определяет, как операторы группируются, когда разные операторы появляются рядом в одном выражении.

~ !~
    Matching, nonmatching.

выше

&&
    Logical “and”. 

Вы можете изменить свою команду на

awk 'tolower($0) ~ /jack/ && tolower($0) ~ /Jill/{ print FILENAME ":" $0; }' *.txt
0 голосов
/ 12 марта 2012

Это может сработать для вас (gawk и, как @kev уже написал в своих комментариях):

awk -vIGNORECASE=1 '/jack/ && /jill/{print FILENAME ":" tolower($0)}' *.txt

нотабене

  • IGNORECASE при значении, отличном от нуля, все строковые шаблоны и регистр регулярных выражений независимы.
  • tolower( строка ) Возвращает копию из строки , причем каждый символ в верхнем регистре в строке заменяется соответствующим символом нижнего регистра.

EDIT:

awk '{$0=tolower($0)};/jack/ && /jill/{print FILENAME ":" $0}' *.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...