Tengo un archivo con el siguiente patrón:
foo 111
baz
foo 222
baz
foo 333
baz
que necesita ser convertido en
foo 111
bar 111
baz
foo 222
bar 222
baz
foo 333
bar 333
baz
Entonces, duplique todas las líneas que comienzan con foo
, y cambie solo foo
en el duplicado, pero deje intacto el resto de la línea (que difiere en cada caso). ¿Como hacer esto?
regular-expression
search
LB7979
fuente
fuente
Respuestas:
Aqui tienes:
Descomponiendo:
Debido a que el
g
comando actualizará el patrón de búsqueda, puede omitir el patrón para reemplazarlo en el comando sustituto. (ref .::h :g
buscarsearch pattern
).Versión antigua:
Descomponiendo:
Para insertar la
^M
prensa Ctrl+vy enter.Nota : Originalmente se me ocurrió la versión "anterior", antes de conocer el
t
comando. Lo dejaré pero no recomendaré usarlo. El primero es más limpio y directo.fuente
foo
...^M
como te expliqué?t
, y luego agregué la segunda. Cambiaré el orden, tienes razón. ¿Qué tal si el primero es POSIX?Hago cosas como esta todo el tiempo y simplemente hago algo como
%s/^foo \(.*\)/foo \1\rbar \1/
(en parte porque también hago muchas tareas similares que no se pueden convertir en algo inteligente usando una función de copia, y ahora\(.*\)
es parte de mi memoria muscular).Sospecho que no es compatible con POSIX (no funciona en otros clones vi), pero usar
^M
( C-VReturn) en lugar de\r
parece funcionar en la mayoría de los otros clones vi.fuente