Supongamos que tenemos un fichero JSON como el siguiente:
{ "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", … } |
En Vim podremos hacerlo definiendo una función:
: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/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.