如何从 json 字段构建 bash 超链接字符串?

how can I build bash hyperlink strings from json fields?

我从纽约时报 API 获得一些 JSON 数据。我可以用这种形式得到东西:

"results": [
{
  "headline": "such and such",
  "url": "http://such.and.such.com",
  ...
},
{
  "headline": "so and so",
  "url": "http://so.and.so.com",
  ...
},
...
]

我想为数组中的每个 object 回显 1 个字符串,以便字符串文本显示标题,并且该字符串可点击到 url。

我知道要如何构建字符串:

echo -e "\e]8;;$URL\a$TITLE\e]8;;\a"

我不知道如何使用 jq 填充字符串的那些可变部分。

> echo $RESULTS | jq '.results[] | "\e]8;;\(.url)\a\(.title)\e]8;;\a"'
jq: error: Invalid escape at line 1, column 4 (while parsing '"\e"') at <top-level>, line 1:
.results[] | "\e]8;;\(.url)\a\(.title)\e]8;;\a"
jq: error: Invalid escape at line 1, column 4 (while parsing '"\a"') at <top-level>, line 1:
.results[] | "\e]8;;\(.url)\a\(.title)\e]8;;\a"
jq: error: Invalid escape at line 1, column 4 (while parsing '"\e"') at <top-level>, line 1:
.results[] | "\e]8;;\(.url)\a\(.title)\e]8;;\a"
jq: error: Invalid escape at line 1, column 4 (while parsing '"\a"') at <top-level>, line 1:
.results[] | "\e]8;;\(.url)\a\(.title)\e]8;;\a"
jq: 4 compile errors

\e\a 在 JSON 字符串中无效;要对转义字符和响铃控制字符进行编码,您需要分别使用 \u001b\u0007。您可能还想使用 jq-r 选项使其输出原始字符串(而不是 JSON-encoded)。

我也强烈推荐 double-quoting shell 变量引用(以避免分词和通配符扩展的怪异效果),并使用较低或 mixed-case 变量名来避免冲突许多 all-caps 个具有特殊含义或功能的名称。

所以像这样:

echo "$results" | jq -r '.results[] | "\u001b]8;;\(.url)\u0007\(.title)\u001b]8;;\u0007"'

或者,在 bash(但不是所有其他 shell 中)您可以使用 here-string 而不是 echo:

jq -r '.results[] | "\u001b]8;;\(.url)\u0007\(.title)\u001b]8;;\u0007"' <<<"$results"

您可以使用 bash 转义序列 $ :

保留原始 jq 脚本
jq -r $'.results[] | "\e]8;;\(.url)\a\(.title)\e]8;;\a"' <<< "$results"

此处bash会将\e转换为字符0x1b