awk 正则表达式中的操作和不区分大小写?

bit*_*bit 0 linux bash awk text-processing regular-expression

我正在尝试匹配包含两个文本模式的文件名,但匹配过程应该忽略大小写。以下正则表达式都不起作用:

将 awk 变量 'IGNORECASE' 设置为非零值(如 中推荐的那样info awk),以便所有正则表达式和字符串操作忽略大小写,然后使用两个正则表达式构建逻辑“与”操作将打印所有文件:

$ ls -R | awk 'IGNORECASE = 1;/bingo/ && /number/;'
Run Code Online (Sandbox Code Playgroud)


在使用前瞻(我知道不需要第二个前瞻)之前,我尝试将数据转换为小写字母以匹配文本模式“bingo”和“number”。但是 awk 不打印任何输出,默认情况下应该是1 , 2

$ ls -R | awk 'tolower($0) ~ /(?=.*bingo)(?=.*number)/'
Run Code Online (Sandbox Code Playgroud)

awk 或正则表达式语法的哪一部分是错误的(或缺少什么),以及仅当附加模式出现​​在同一行时才成功的独立于大小写的搜索的正确方法是什么?

更新:

从跑步开始

$ ls -R | awk '/bingo/'
Run Code Online (Sandbox Code Playgroud)

似乎awk可以在每个文件中的输出进行针对行中的匹配ls -R由于不包含字符串常量“宾果”由相匹配的文件名awk。如果是这种情况,您如何获得awkgrep从(即通过)管道接收输出时相同的行为?

Ed *_*ton 5

写你的第一个脚本:

awk 'IGNORECASE = 1;/bingo/ && /number/;'
Run Code Online (Sandbox Code Playgroud)
  1. 正如评论中所指出的,IGNORECASE 只是呆呆的,并且
  2. 您的 awk 代码相当于:

    awk '(IGNORECASE = 1){print}; (/bingo/ && /number/){print}'
    
    Run Code Online (Sandbox Code Playgroud)

所以它会在 GNU awk 中进行不区分大小写的匹配,但不会在其他 awk 中进行,并且它将始终打印当前行(因为赋值IGNORECASE=1评估为1真条件),然后将打印包含宾果游戏和数字的任何行第二次。

写你的第二个脚本:

awk 'tolower($0) ~ /(?=.*bingo)(?=.*number)/'
Run Code Online (Sandbox Code Playgroud)

?=东西是 PCRE 环视 - awk 支持 ERE,而不是 PCRE,所以我必须考虑它在 ERE 中的真正含义,但无论它是什么,它都不是您想要的含义。

写下你的声明:

似乎 awk 可能正在对 ls -R 输出中每个文件中的行执行匹配

我不知道你为什么这么认为,但不,它不是。

这是我认为您在 GNU awk 中想要的:

awk 'BEGIN{IGNORECASE=1}; /bingo/ && /number/'
Run Code Online (Sandbox Code Playgroud)

或者:

awk -v IGNORECASE=1 '/bingo/ && /number/'
Run Code Online (Sandbox Code Playgroud)

并且在任何 awk 中:

awk '{lc=tolower($0)}; (lc ~ /bingo/) && (lc ~ /number/)'
Run Code Online (Sandbox Code Playgroud)