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)
$ 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。如果是这种情况,您如何获得awk与grep从(即通过)管道接收输出时相同的行为?
写你的第一个脚本:
awk 'IGNORECASE = 1;/bingo/ && /number/;'
Run Code Online (Sandbox Code Playgroud)
您的 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)