Supongamos que tenemos un fichero JSON como el siguiente:
{ "clave1" : "valor11", "clave2": "valor12", … }
{ "clave1" : "valor21", "clave2": "valor22", … }
…
{ "clave1" : "valorN1", "clave2": "valorN2", … } |
{ "clave1" : "valor11", "clave2": "valor12", … }
{ "clave1" : "valor21", "clave2": "valor22", … }
…
{ "clave1" : "valorN1", "clave2": "valorN2", … }
y queremos añadir un campo nuevo al comienzo, con un _id incremental, para que quede así:
{ "_id" : 1, "clave1" : "valor11", "clave2": "valor12", … }
{ "_id" : 2, "clave1" : "valor21", "clave2": "valor22", … }
…
{ "_id" : n, "clave1" : "valorN1", "clave2": "valorN2", … } |
{ "_id" : 1, "clave1" : "valor11", "clave2": "valor12", … }
{ "_id" : 2, "clave1" : "valor21", "clave2": "valor22", … }
…
{ "_id" : n, "clave1" : "valorN1", "clave2": "valorN2", … }
En Vim podremos hacerlo definiendo una función:
:let g:incr = 0
:function Incr()
:let g:incr = g:incr + 1
:return g:incr
:endfu |
:let g:incr = 0
:function Incr()
:let g:incr = g:incr + 1
:return g:incr
:endfu
Una vez definida la función Incr(), podremos invocarla en una orden find&replace con el operador \= que permite evaluar expresiones y hacer la sustitución que buscamos:
Es decir:
:%s/^{/\="{\"_id\":" . Incr() . ","/gc |
:%s/^{/\="{\"_id\":" . Incr() . ","/gc
:%s/cadena_a_buscar/cadena_sustituta/gc
Cadena a buscar: ^{ (que empiece por {)
Cadena sustituta: =«{\»_id\»:» . Incr() . «,» (es decir, evaluar la expresión «_id\»:» . Incr() . «,», que inicialmente será «_id»:1 )
/gc : Cambios globales (a todo el documento, no sólo la primera aparición) y con confirmación (puedes pulsar la tecla «a» (all) cuando veas que los cambios son correctos tras las primeras sustituciones)
Si quieres más info sobre funciones y el lenguaje VimScript, échale un vistazo a este tutorial.