解析多个 json 文件并针对具有关联文件名的正则表达式输出 match/hits
Parse multiple json files and output the match/hits against the regex with associated file names
目前,通过管道传输到 jq 的 cat 命令帮助我解析工作目录中的多个 JSON 文件,并根据文件中所有可用的正则表达式模式匹配电子邮件 ID 进行筛选。但是,我很想识别正则表达式模式所在的文件名 hit/matched
cat *.json | jq '. as $data | [path(..| select(scalars and (tostring | test("^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+$", "ixn")))) ] | map({ (.|join(".")): (. as $path | .=$data | getpath($path)) }) | reduce .[] as $item ({}; . * $item)'
请求您帮助调整打印 $filename 的命令。谢谢!
input_filename
计算当前正在读取的文件的输入文件名(在打开后)。对于 STDIN,它的计算结果为 "<stdin>"
:
jq 'input_filename, input_filename' <<< 1
"<stdin>"
"<stdin>"
它与 -n 命令行选项一起使用,但仅在调用 input
或 inputs
函数之后:
jq -n 'input_filename, (input | input_filename)' <<< 1
null
"<stdin>"
对于 jq 内部解决方案,请按照@peak 的建议使用 input_filename
。这是一个外部解决方案,它遍历您的输入文件并将文件名作为变量传递给 jq。但是,这种方法会为每个输入文件调用一次 jq(与只调用一次的 cat *.json | jq ...
方法相反),因此当应用于大量输入文件时,您可能 运行 会遇到性能问题.
for f in *.json
do jq --arg f "$f" '. as $data | ... (use $f here) ...' "$f"
done
目前,通过管道传输到 jq 的 cat 命令帮助我解析工作目录中的多个 JSON 文件,并根据文件中所有可用的正则表达式模式匹配电子邮件 ID 进行筛选。但是,我很想识别正则表达式模式所在的文件名 hit/matched
cat *.json | jq '. as $data | [path(..| select(scalars and (tostring | test("^[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+$", "ixn")))) ] | map({ (.|join(".")): (. as $path | .=$data | getpath($path)) }) | reduce .[] as $item ({}; . * $item)'
请求您帮助调整打印 $filename 的命令。谢谢!
input_filename
计算当前正在读取的文件的输入文件名(在打开后)。对于 STDIN,它的计算结果为 "<stdin>"
:
jq 'input_filename, input_filename' <<< 1
"<stdin>"
"<stdin>"
它与 -n 命令行选项一起使用,但仅在调用 input
或 inputs
函数之后:
jq -n 'input_filename, (input | input_filename)' <<< 1
null
"<stdin>"
对于 jq 内部解决方案,请按照@peak 的建议使用 input_filename
。这是一个外部解决方案,它遍历您的输入文件并将文件名作为变量传递给 jq。但是,这种方法会为每个输入文件调用一次 jq(与只调用一次的 cat *.json | jq ...
方法相反),因此当应用于大量输入文件时,您可能 运行 会遇到性能问题.
for f in *.json
do jq --arg f "$f" '. as $data | ... (use $f here) ...' "$f"
done