如何从 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
。
我从纽约时报 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 -r $'.results[] | "\e]8;;\(.url)\a\(.title)\e]8;;\a"' <<< "$results"
此处bash会将\e
转换为字符0x1b
。