Pregunta

Me preguntaba si alguien podría ayudarme a hacer lo siguiente usando vi.

Tengo un archivo de texto y puede contener algo como

start of text file:
--something1.something2--
--anotherThing1.something2--
end of text file:

Si quiero tomar esta línea y convertirla buscando cualquier cosa que coincida con la primera aparición de [A-Za-z0-9] copie eso en el búfer y luego agréguelo al misma línea antes de la primera aparición de -

start of text file:
--something1.something2.something1--
--anotherThing1.something2.anotherThing1--
end of text file:

¿Hay un solo comando de VI para hacer esto?

Saludos Ben

¿Fue útil?

Solución

:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/gc

o sin pedir confirmación para cada reemplazo:

:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/g

producirá:

--something1.something2.something1--
--anotherThing1.something2.anotherThing1--

de:

--something1.something2--
--anotherThing1.something2--

Esto es si desea copiar la primera palabra después de '-' hasta la primera '.' y agregue '.' y palabra encontrada antes del último '-'.

Usando vim.

RE COMENTARIOS:

Alguien mencionó que no funcionará cuando haya varias palabras, etc. Lo probé en lo siguiente:

start of text file:
--something1.something2.something3.something4.something5.something6--
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5--
end of text file:

después de reemplazar con la expresión anterior:

start of text file:
--something1.something2.something3.something4.something5.something6.something1--
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5.anotherThing1--
end of text file:

Otros consejos

Prueba esto:

%s:\([A-Za-z0-9]\+\)\(\..\+\)--:\1\2.\1--:g

Mierda, ¡en el tiempo que me llevó iniciar sesión para publicar esa respuesta, la publicaste y ya recibiste un comentario!

%s/--\(\w*\)\.\(.*\)--/--\1.\2.\1--/g

--ab1.cd2..yz99-- - > --ab1.cd2..yz99.ab1--

Basándose en la solución de stefanB pero usando clases de caracteres negadas y la "muy mágica" configuración, llego al siguiente comando de sustitución:

:%s/\v--([^.]+)\.(.*)--/--\1.\2.\1--/

Dependiendo de los requisitos exactos (qué son los caracteres permitidos para "algo1" y "otra cosa1") esto podría o no ser más correcto.

Una cosa más a tener en cuenta: todas las soluciones publicadas hasta ahora suponen que solo hay una aparición del patrón & text; text.someOtherText-- por línea. Si este no es el caso, la parte (. *) Del patrón debería ajustarse y se requiere el modificador / g.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top