awk中不区分大小写的字符串匹配

问题描述 投票:2回答:2

假设一个多行文本文件file,其中一些行以空格开头。

$ cat file
foo Baz
  baz QUX
    QUx Quux
BaZ Qux
BazaaR

进一步假设我希望将所有那些以关键字(例如“baz”)开头的行转换为小写字母,而不管(a)该关键字是用小写或大写字母(或其任何组合)本身写的,以及( b)该关键字前面有空格。

$ cat file | sought_command
foo Baz        # not to lowercase (line does not start with keyword)
  baz qux      # to lowercase
    QUx Quux
baz qux        # to lowercase
BazaaR         # not to lowercase (line does not start with keyword, but merely with a word containing the keyword)

我相信awk是这样做的工具,但我不确定如何实现关键字匹配的不区分大小写。

$ cat file | awk '{ if($1 ~ /^ *baz/) print tolower($0); else print $0}'
foo Baz
  baz qux
    QUx Quux
BaZ Qux       # ERROR HERE: was not replaced, b/c keyword not recognized.
BazaaR

编辑1:添加IGNORECASE=1似乎解决了不区分大小写,但现在错误地将最后一行转换为小写。

$ cat file | awk '{IGNORECASE=1; if($1~/^ *baz/) print tolower($0); else print $0}'
foo Baz
  baz qux
    QUx Quux
baz qux
bazaar       # ERROR HERE: should not be converted to lowercase, as keyword not present (emphasis on word!).
string awk matching case-sensitive lowercase
2个回答
© www.soinside.com 2019 - 2024. All rights reserved.