2017-09-20 1 views
0

私はjqに私の入力に次の文字列を持っている:jqのsedやviのような後方参照?

"\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で使用していますか?ここで

答えて

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" 
+0

だから、この上の公式の構文は何ですか?あなたは '? 'それは一致する式のようにかっこの間になければなりませんか? – leeand00

+0

[manual](https://stedolan.github.io/jq/manual/#RegularexpressionsPCRE)はこれに少し似ており、セクション全体を読むのに役立ちます。 [実装](https://github.com/stedolan/jq/blob/master/src/builtin.jq#L115-L153)は、[一致](https://github.com/stedolan/)に依存するように見えます。 jq/blob/master/src/builtin.c#L753)が '.captures'に保存するので、jqが[oniguruma](https://github.com/kkos/oniguruma)を使用しているので気になる逆参照がサポートされているとは思わない/ blob/master/doc/RE)を使って正規表現の作業を行い、それをサポートしているようです。おそらくそれらは検索パターンでのみ許可されます。 – jq170727

関連する問題