Puedo usar
:5,12s/foo/bar/g
para buscarlo fooy reemplazarlo barentre las líneas 5 y 12. ¿Cómo puedo hacer eso solo en las líneas 5 y 12 (y no en las líneas intermedias)?
Respuestas:
Vim tiene átomos especiales de expresión regular que coinciden en ciertas líneas, columnas, etc .; puede usarlos (posiblemente además del rango) para limitar las coincidencias:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
Ver :help /\%l
Puede hacer la sustitución en la línea 5 y repetirla con un mínimo esfuerzo en la línea 12:
:5s/foo/bar
:12&
Como señala Ingo, se :&olvida de sus banderas. Dado que está utilizando /g, el comando correcto sería :&&:
:5s/foo/bar/g
:12&&
Ver :help :&y amigos.
:&utilizar lo oscuro . Si hay banderas ( s/../../g), uno tiene que usar :&&, aunque ...
\(\%5l\|\%12l\)es más oscuro que:&
Siempre puedes agregar un cal final. Esto pedirá confirmación para todos y cada uno de los partidos.
:5,12s/foo/bar/gc
gbandera en juego)
n5 o 6 veces es más oneroso que agregar \(\%5l\|\%12l\)a la declaración sustituta?
Interesante pregunta. Parece que solo hay selección de rango y no selección de línea múltiple:
http://vim.wikia.com/wiki/Ranges
Sin embargo, si tiene algo especial en las líneas 5 y 12, puede usar el :goperador. Si su archivo se ve así (números solo como referencia):
1 line one
2 line one
3 line one
4 line one
5 enil one
6 line one
7 line one
8 line one
9 line one
10 line one
11 line one
12 enil one
Y desea reemplazar onepor enoen las líneas donde hay en enillugar de line:
:g/enil/s/one/eno/
Podría usar ed: un editor de texto orientado a líneas con comandos similares a vi y vim. Probablemente sea anterior a vi y vim.
En un script (usando un documento aquí que procesa la entrada hasta el marcador EndCommand) se vería así:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
Obviamente, los comandos ed también se pueden usar en la línea de comandos.
vimalternativa.
:s, pero aún existe la duplicación del :scomando (que evita la solución de romainl).
sedembargo, mi preferencia sería ...