我试图jq
通过模仿答案来在一个命令中处理两个字符串这个问题。
但我什至无法完成简单的任务,例如连接两个字符串(存储在 bash 变量中str1
)str2
。我通过调整 SO 答案尝试了以下操作:
jq -s -R '.[0] + .[1]' <(echo "$str1") <(echo "$str2")
但我收到一个错误:
jq:错误(位于/dev/fd/62:1):无法用数字索引字符串
我是jq新手。
有人可以解释一下如何修复上述 jq 用法吗?
(这是 jq 1.6、Ubuntu 18.04 LTS 的情况)。
- 更新 -
只是为了澄清。我的想法更复杂。基本上,我需要解析两个字符串(它们是 CSV),然后合并两个解析后的字符串数组(粗略地说)。但我无法绕过获取输入。
正如评论中正确指出的那样,其他工具可能会更好地处理两个原始字符串。而且我也可以轻松编写程序。但我只是更喜欢 jq 干净的工作流程。
无论如何,真正的问题是上面发布的。但作为一个更具体的例子:
如果我有两个字符串
str1='(a),(c),(b)'
str2='(a),(b)'
我想编写一个jq
命令来解析两个数组/集并找出它们的差异。所以预期的输出是
(c)
我知道jq
可以进行所有排序、设置差异等(如文档和链接的 SO 问题所示),但我不确定如何将两个输入输入 jq。
答案1
我可以尝试发出以下命令
sed -z 's/\n/,/g;s/,$/\n/' <(comm -3 <(echo "${str1//,/$'\n'}" | sort) <(echo "${str2//,/$'\n'}" | sort))
进行的测试
$ str1='(a),(c),(b),(d)'
$ str2='(a),(b)'
$ sed -z 's/\n/,/g;s/,$/\n/' <(comm -3 <(echo "${str1//,/$'\n'}" | sort) <(echo "${str2//,/$'\n'}" | sort))
(c),(d)
shell参数替换
echo "${str1//,/$'\n'}
用换行符替换逗号。
由于该comm
命令需要对值进行排序
echo "${str1//,/$'\n'}" | sort
避免替换最后一行的换行符
sed -z 's/\n/,/g;s/,$/\n/'
注意。-z
将分隔符更改为空字符 (\0
)。这可以与它的局限性。