在 JQ 中不区分大小写地匹配固定字符串

Match fixed strings case-insensitively in JQ

问题: .contains 不区分大小写;其中测试和匹配会产生大量噪音,因为它不是字符串匹配。

我的脚本

#!/bin/bash
filename='v.txt'

while read p; do 
    jq 'if .tweet | contains('\"$p\"') then . |= . + {vendor: '\"$p\"'} else empty end' sfilter.json
done < $filename

这是完美的;但如果是不敏感的内容,它就不起作用了 |另外,测试和匹配也没有成功,因为它们没有进行字符串匹配。

正如@OguzIsmail 所指出的,如果您的 jq 正则表达式引擎支持 \Q...\E,您可以使用它。然而,并非所有版本的 oniguruma(因此并非所有已发布的 jq 版本)都提供此类支持;无论如何,以下用于“去正则化”字符串的 jq def 可以帮助减少“噪音”:

def deregex:
  reduce ("\\", "\*", "\^", "\?", "\+", "\.", "\!", "\{", "\}", "\[", "\]", "\$", "\|" ) as $c
    (.; gsub( $c; $c));

例子

有了上面的def,下面是:

"A*b" |  test( "a*b"| deregex | debug; "i")

产生:

["DEBUG:","a\*b"]
true

test 可以进行文字串匹配。

test("\Qstring\E"; "i")

Online demo

您也可以使用 ascii_downcase :

#!/bin/bash
filename='v.txt'

while read p; do 
    jq --arg p "$p" '
def contains_i($C; $c):
    $C | ascii_downcase | contains($c|ascii_downcase);

if contains_i(.tweet; $p)
then . |= . + {vendor: $p}
else empty end' sfilter.json
done < $filename