像sed或vi这样的jq反向引用?

时间:2017-09-20 13:12:48

标签: jq backreference

我在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进行反向引用,因此在sedvi使用jq中的反引用匹配功能可以实现类似的功能}?

1 个答案:

答案 0 :(得分:2)

以下是使用带有subgsub的命名捕获?<a>的演示:

$ 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"