linux 有没有一种方法可以将我的自定义函数传递给jq选择函数?

dsf9zpds  于 2023-08-03  发布在  Linux
关注(0)|答案(1)|浏览(100)

我有这样一段代码,我想检查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

hts6caw3

hts6caw31#

有没有一种方法可以将我的自定义函数传递给jq选择函数?
不,如果是bash函数就不行。另见@pmf的评论。
在jq的上下文中(以及许多其他上下文中),通常最好从“传入数据”而不是“传入函数”的Angular 来考虑。在目前的情况下,后者导致一个非常简单的解决方案。
如果bookmark.json包含如图所示的JSON流,那么您可以简单地使用以下jq调用来获得所需的结果:

< bookmark.json jq -r --arg keyword Networking '
  select(.name | index($keyword))
'

字符串
正如@pmf所指出的,index是大小写敏感的。如果您希望检查不区分大小写,则有各种可能性,具体取决于您的详细要求,例如:关于鲁棒性、Unicode大小写折叠规则等。可以考虑的一种可能性是使用ascii_upcase,例如:

($keyword | ascii_upcase) as $k
    | select(.name | ascii_upcase | index($k))

相关问题