Después de hurgar un poco más, resulta que vim puede hacerlo con un solo comando, sin secuencias de comandos. Por ejemplo, para agregar 50 a todos los números siguientes <obj param="
, puede usar:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
Déjame desglosar eso.
:
es la forma general de ingresar / significar el modo de línea de comandos en vim.
%
significa dentro del alcance de todo el documento; podría poner un rango de números, por ejemplo, 1,50
para hacerlo dentro de las primeras 50 líneas.
s
es una forma abreviada de sustituto (puede escribir la palabra completa si lo prefiere)
@
es el delimitador; podrías usar cualquier otro personaje siempre que no esté en lo que estás buscando. Solo úsalo tres veces. (La sintaxis es similar a sed
).
Todo hasta la próxima aparición del delimitador @ es el patrón regular a buscar, en este caso <obj param="
seguido de \d\+
, que es cualquier número de dígitos. El \(
y \)
está ahí para establecer esta secuencia completa de dígitos como un solo grupo de registro anterior que coincidiría con las referencias anteriores como \1
, o el submatch
comando de vim .
Luego, el delimitador @
marca lo que sigue como texto de reemplazo.
El \=
en los medios que comienzan aquí para sustituir el resultado de una expresión evaluada, en lugar de un patrón reg ex o cadena, que es clave aquí.
Luego tenemos '<obj param="'
para el inicio del texto de reemplazo. Lo .
que sigue es la función de vim para concatenar cadenas.
submatch(1)
es una función incorporada de vim que solo se puede usar dentro de un comando de sustitución y devuelve la cadena que es la misma que la expresión regular \1
; lo usarías submatch(2)
para el equivalente de expresiones regulares \2
y así sucesivamente. ( \0
es todo el patrón coincidente, pero no queremos eso aquí). El \(
y \)
en el patrón de búsqueda se utilizan para marcar lo que cuenta como submatch(1)
.
Por lo tanto, (submatch(1) + 50)
da el resultado de sumar 50 al número que siguen los dígitos <obj param="
en el patrón de búsqueda.
El delimitador @
se usa nuevamente para marcar el final del texto de reemplazo.
La bandera g
se usa para hacer que las sustituciones sean globales; podría omitir esto si solo quisiera reemplazar la primera instancia en cada línea.
A partir de ahí, probablemente pueda averiguar cómo sumar diferentes números, restar, dividir, etc.
vim
yemacs
puedo hacer este tipo de cosas, pero podría requerir escribir un script en lugar de usar un solo comando.