在 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")
您也可以使用 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
问题: .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")
您也可以使用 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