像 sed 或 vi 这样的 jq 中的反向引用?
Backreferences in jq like sed or vi?
我在 jq
的输入中有以下字符串:
"\n*blah\n**tim\nbob was here\n*item1\n**item2\n"
而且我能够将第一个 \n*
与以下匹配:
[match("(\n\*[A-Za-z0-9]*\n)";"g")]
这给了我以下匹配项:
[
{
"offset": 0,
"length": 7,
"string": "\n*blah\n",
"captures": [
{
"offset": 0,
"length": 7,
"string": "\n*blah\n",
"name": null
}
]
},
{
"offset": 25,
"length": 8,
"string": "\n*item1\n",
"captures": [
{
"offset": 25,
"length": 8,
"string": "\n*item1\n",
"name": null
}
]
}
]
然而,我的目标是搜索这些并在匹配的 \n*
行的开头添加额外的 \n
。
我似乎无法使用 gsub 进行反向引用,所以是否有与 sed
和 vi
中使用反向引用匹配在 [=11= 中可以完成的功能类似的功能]?
这是一个使用命名捕获 ?<a>
和 sub and gsub:
的演示
$ jq -Mn '
"\n*blah\n**tim\nbob was here\n*item1\n**item2\n"
| sub("(?<a>\n\*[A-Za-z0-9]*\n)";"\n\(.a)";"g")
, gsub("(?<a>\n\*[A-Za-z0-9]*\n)";"\n\(.a)")
'
输出
"\n\n*blah\n**tim\nbob was here\n\n*item1\n**item2\n"
"\n\n*blah\n**tim\nbob was here\n\n*item1\n**item2\n"
我在 jq
的输入中有以下字符串:
"\n*blah\n**tim\nbob was here\n*item1\n**item2\n"
而且我能够将第一个 \n*
与以下匹配:
[match("(\n\*[A-Za-z0-9]*\n)";"g")]
这给了我以下匹配项:
[
{
"offset": 0,
"length": 7,
"string": "\n*blah\n",
"captures": [
{
"offset": 0,
"length": 7,
"string": "\n*blah\n",
"name": null
}
]
},
{
"offset": 25,
"length": 8,
"string": "\n*item1\n",
"captures": [
{
"offset": 25,
"length": 8,
"string": "\n*item1\n",
"name": null
}
]
}
]
然而,我的目标是搜索这些并在匹配的 \n*
行的开头添加额外的 \n
。
我似乎无法使用 gsub 进行反向引用,所以是否有与 sed
和 vi
中使用反向引用匹配在 [=11= 中可以完成的功能类似的功能]?
这是一个使用命名捕获 ?<a>
和 sub and gsub:
$ jq -Mn '
"\n*blah\n**tim\nbob was here\n*item1\n**item2\n"
| sub("(?<a>\n\*[A-Za-z0-9]*\n)";"\n\(.a)";"g")
, gsub("(?<a>\n\*[A-Za-z0-9]*\n)";"\n\(.a)")
'
输出
"\n\n*blah\n**tim\nbob was here\n\n*item1\n**item2\n"
"\n\n*blah\n**tim\nbob was here\n\n*item1\n**item2\n"