如何在jq字符串插值中拆分过滤器为多行且保持输出不变?
解决jq过滤器多行拆分的问题
当需要把较长的jq过滤器拆分成多行提升可读性时,以下几种方法可以实现需求,同时保证输出符合预期:
方法1:用字符串拼接符+拆分
将字符串模板拆分成多行,通过+连接各部分,既保持过滤器的可读性,又不会引入多余换行:
echo '{"foo":"bar","boo":"moo"}' | jq -r ' "\(.foo)" + "|" + "\(.boo)" '
输出:
bar|moo
方法2:借助Shell续行符\
利用Shell的续行符\将单引号包裹的过滤器拆成多行,Shell会自动把这些行拼接成完整的单行过滤器传给jq:
echo '{"foo":"bar","boo":"moo"}' | jq -r '\ "\(.foo)|\ \(.boo)"\ '
输出同样是bar|moo。
方法3:数组+join()(推荐)
如果要拼接的字段较多,把字段放入数组后用join("|")生成结果,这种写法最清晰:
echo '{"foo":"bar","boo":"moo"}' | jq -r ' [.foo, .boo] | join("|") '
输出结果一致。
原写法无效的原因
你之前尝试的写法会把过滤器里的换行符保留在输出字符串中,导致输出包含多余换行:
echo '{"foo":"bar","boo":"moo"}' | jq -r ' " \(.foo)| \(.boo) " '
实际输出是:
bar| moo
这不符合预期,所以这种写法无效。
内容的提问来源于stack exchange,提问作者Dmitry z
相关产品推荐
相关产品推荐

