2017-09-20 4 views
0

J'ai la chaîne suivante dans mon entrée à jq:Backreferences dans jq comme sed ou vi?

"\n*blah\n**tim\nbob was here\n*item1\n**item2\n"

Et je suis en mesure de faire correspondre la première \n* ce qui suit:

[match("(\n\\*[A-Za-z0-9]*\n)";"g")]

Ce qui me donne ce qui suit résultats:

[ 
    { 
    "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 
     } 
    ] 
    } 
] 

Mon but cependant, est de rechercher ceux-ci et d'ajouter un \n supplémentaire au début des lignes \n* appariées.

Je ne semble pas être en mesure de le faire en utilisant gsub des backreferences, donc est-il une fonctionnalité similaire à ce qui peut être fait dans sed et vi à l'aide backreference correspond à jq?

Répondre

2

Voici une démonstration utilisant une capture du nom ?<a> avec sub et 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)") 
' 

sortie

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

Alors, quelle est la syntaxe officielle à ce sujet? Avez-vous besoin du '? 'et il doit être entre les parenthèses, tout comme l'expression correspond? – leeand00

+0

Le [manuel] (https://stedolan.github.io/jq/manual/#RegularexpressionsPCRE) est un peu laconique à ce sujet et aide à lire toute la section. Le [implémentation] (https://github.com/stedolan/jq/blob/master/src/builtin.jq#L115-L153) semble dépendre de ce que [match] (https://github.com/stedolan/ jq/blob/master/src/builtin.C# L753) stocke dans '.captures' donc je ne pense pas que les backreferences soient supportées ce qui est curieux car jq utilise [oniguruma] (https://github.com/kkos/oniguruma/blob/master/doc/RE) pour faire le travail de regex et il semble les soutenir. Peut-être qu'ils sont seulement autorisés dans le modèle de recherche. – jq170727