我有这样一段代码,我想检查JSON对象中的name属性是否包含特定的单词。
在fetchLog函数中,我使用jq查询包含特定单词的对象。jq代码中的函数checkName,用于检查name属性是否包含关键字$1,该关键字是函数fetchLog的参数。
function fetchLog(){
jq -r '.roots.bookmark_bar.children[]' | \
jq '{name,url} | select((checkName .name $1) == true)' bookmark.json
}
function checkName()
{
if [[ $1 == *"$2"* ]]; then
echo true
else
echo false
fi
}
字符串
bookmark.json包含:
{
"name": "Networking",
"url": "https://www.youtube.com/watch?v=AhOU2eOpmX0&list=PLIFyRwBY_4bRLmKfP1KnZA6rZbRHtxmXi&index=7"
}
{
"name": "algorithm - How are ssl certificates verified? - Stack Overflow",
"url": "https://stackoverflow.com/questions/188266/how-are-ssl-certificates-verified"
}
{
"name": "(170) What is SSL & TLS ? What is HTTPS ? What is an SSL VPN? - Practical TLS - YouTube",
"url": "https://www.youtube.com/watch?v=HMoFvRK4HUo&list=PLIFyRwBY_4bTwRX__Zn4-letrtpSj1mzY"
}
型
运行fetchLog networking
时。
我不断得到一个错误:
+ jq '{name,url} | select((checkName .name $1) == true)'
jq: error: syntax error, unexpected '$' (Unix shell quoting issues?) at <top-level>, line 1:
{name,url} | select((checkName .name $1) == true)
jq: 1 compile error
型
我期望的输出是
fetchLog networking
型
以便
{
"name": "Networking",
"url": "https://www.youtube.com/watch?v=AhOU2eOpmX0&list=PLIFyRwBY_4bRLmKfP1KnZA6rZbRHtxmXi&index=7"
}
型
而不是错误:
+ jq '{name,url} | select((checkName .name $1) == true)'
jq: error: syntax error, unexpected '$' (Unix shell quoting issues?) at <top-level>, line 1:
{name,url} | select((checkName .name $1) == true)
jq: 1 compile error
型
1条答案
按热度按时间hts6caw31#
有没有一种方法可以将我的自定义函数传递给jq选择函数?
不,如果是bash函数就不行。另见@pmf的评论。
在jq的上下文中(以及许多其他上下文中),通常最好从“传入数据”而不是“传入函数”的Angular 来考虑。在目前的情况下,后者导致一个非常简单的解决方案。
如果bookmark.json包含如图所示的JSON流,那么您可以简单地使用以下jq调用来获得所需的结果:
字符串
正如@pmf所指出的,
index
是大小写敏感的。如果您希望检查不区分大小写,则有各种可能性,具体取决于您的详细要求,例如:关于鲁棒性、Unicode大小写折叠规则等。可以考虑的一种可能性是使用ascii_upcase
,例如:型