当每行匹配多个单词时,awk tolower函数不起作用

时间:2012-03-12 03:03:51

标签: regex awk lowercase

我在这里看到了一个文件:

$ more 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 个答案:

答案 0 :(得分:3)

Operator precedence确定当不同的运算符在一个表达式中出现时,运算符的分组方式。

~ !~
    Matching, nonmatching.

高于

&&
    Logical “and”. 

您可以将命令更改为

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

答案 1 :(得分:0)

这可能适合你(gawk和@kev已在他的评论中写过):

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

N.B。

    设置为非零的
  • IGNORECASE会使所有字符串模式与regexp的案例无关。
  • tolower( string )返回字符串副本,字符串中的每个大写字符都替换为它对应的小写字符。

编辑:

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