regex vim data-manipulation

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