【问题标题】:awk tolower function not working when matching more than one word per lineawk tolower 函数在每行匹配多个单词时不起作用
【发布时间】:2012-03-28 12:14:19
【问题描述】:

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

$ 更多 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:杰克和吉尔上山了。

谢谢!

【问题讨论】:

    标签: regex awk lowercase


    【解决方案1】:

    Operator precedence 确定当不同的运算符出现在一个表达式中时如何对运算符进行分组。

    ~ !~
        Matching, nonmatching.
    

    高于

    &&
        Logical “and”. 
    

    您可以将命令更改为

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

    【讨论】:

    • 有趣。这似乎有效,谢谢!但是为什么我必须不断地为每个单词添加 tolower() 呢?你知道是否有一种简单的方法可以在 awk 期间强制 $0 为小写?
    • awk '{$0=tolower($0)}; ...'
    • awk -vIGNORECASE=1 '...'
    【解决方案2】:

    这可能对你有用(gawk 和 @kev 已经写在他的 cmets 中):

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

    注意

    • IGNORECASE 设置为非零使所有字符串模式和正则表达式的大小写无关。
    • tolower(string) 返回 stringcopy,字符串中的每个大写字符都替换为其对应的小写字符。

    编辑:

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

    【讨论】:

    • 感谢您的提示。我试图将 awk 作为最低公分母,因为我需要它在多个版本的 linux 上工作,而且我不知道哪个版本会有 gawk。
    • 第二种解决方案应该适用于所有变体。但是它可能会与空格混淆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2011-12-21
    相关资源
    最近更新 更多