regex - Vim busca y reemplaza, añadiendo una constante.
data-manipulation (6)
Aquí hay una simplificación y una solución a la solución de hobbs:
:%s/identifying text /zs/d/+/(./d/+/)/=//=(1.15+str2float(submatch(0)))/
Gracias a /zs
, no hay necesidad de recordar el texto principal. Gracias a str2float()
una sola suma en el número entero (en otras palabras, 1.15 + 2.87 dará el resultado esperado, 4.02, y no 3.102).
Por supuesto, esta solución requiere una versión reciente de Vim (7.3?)
Sé que esto es una posibilidad remota, pero tengo un gran archivo de texto y necesito agregar un número dado a otros números que coincidan con algunos criterios.
P.ej.
identifying text 1.1200
identifying text 1.1400
y me gustaría transformar esto (agregando digamos 1.15) a
identifying text 2.2700
identifying text 2.2900
Normalmente hago esto en Python, pero es en una máquina con Windows donde no puedo instalar muchas cosas. Tengo Vim aunque :)
Bueno, esto podría no ser una solución para vim, pero creo que awk puede ayudar:
cat testscript | LC_ALL=C awk ''{printf "%s %s %s %s %.3f/n", $1,$2,$3,$4,$5+1.567 }''
y la prueba
this is a number 1.56
this is a number 2.56
this is a number 3.56
Necesité el LC_ALL = C para la conversión correcta del separador de punto flotante, y tal vez haya una solución más elegante para imprimir el principio / resto de la cadena. Y el resultado se ve como:
this is a number 3.127
this is a number 4.127
this is a number 5.127
Para los enteros, puedes usar n ^ A para sumar n a un número ( yn ^ X para restarlo). Aunque dudo que eso funcione para los números fraccionarios.
Puedes hacer una expresión regular de captura y luego usar una expresión vimscript como reemplazo, algo como
:%s//(identifying text /)/(/d/+/)/./(/d/+/)/
/=submatch(1) . (submatch(2) + 1) . "." . (submatch(3) + 1500)
(solo sin el linebreak).
Su formato de número parece ser fijo, por lo que es fácil convertir a int y regresar (quitar el punto), agregue 11500 y vuelva a colocar el punto.
:%s//.//
:%normal11500^A " type C-V then C-a
:%s/....$/.&/
Si no quiere hacer eso en todas las líneas, solo la que coincide con ''identificar texto'' reemplaza todos los% por ''g / texto indentificador''
Usando macro
qa .......................... start record macro ''a''
/iden<Enter> ................ search ''ident*'' press Enter
2w .......................... jump 2 words until number one (before dot)
Ctrl-a ...................... increases the number
2w .......................... jump to number after dot
1500 Ctrl-a ................. perform increases 1500 times
q ........................... stop record to macro ''a''
Si tienes 300 líneas con este patrón ahora mismo haciendo
300@a