Puedo usar
:5,12s/foo/bar/g
para buscarlo foo
y reemplazarlo bar
entre 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)?
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:
Como señala Ingo, se
:&
olvida de sus banderas. Dado que está utilizando/g
, el comando correcto sería:&&
:Ver
:help :&
y amigos.fuente
:&
utilizar lo oscuro . Si hay banderas (s/../../g
), uno tiene que usar:&&
, aunque ...\(\%5l\|\%12l\)
es más oscuro que:&
Siempre puedes agregar un
c
al final. Esto pedirá confirmación para todos y cada uno de los partidos.fuente
g
bandera en juego)n
5 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
:g
operador. Si su archivo se ve así (números solo como referencia):Y desea reemplazar
one
poreno
en las líneas donde hay enenil
lugar deline
:fuente
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í:
Obviamente, los comandos ed también se pueden usar en la línea de comandos.
fuente
vim
alternativa.:s
, pero aún existe la duplicación del:s
comando (que evita la solución de romainl).sed
embargo, mi preferencia sería ...