Tengo una lista de archivos:
./a.temp.txt ./a.temp.txt
./a/b.temp.txt ./a/b.temp.txt
./a/b/c.temp.txt ./a/b/c.temp.txt
Y quiero eliminar el temp.
en cada línea, pero solo la segunda ocurrencia , por lo tanto, el archivo debería verse así:
./a.temp.txt ./a.txt
./a/b.temp.txt ./a/b.txt
./a/b/c.temp.txt ./a/b/c.txt
¿Cómo debería hacer esto?
Respuestas:
En general, puede hacer coincidir la enésima aparición de algo con
\zs
y\{N}
. Hay un ejemplo dado en:help \zs
.En su caso, el comando sería:
fuente
%s/\v(.{-}\zstemp.){2}//
Esto es mucho más fácil de hacer con
sed
:Con Vim necesita juego no expansivo, y no es fácil de extender el método a la sustitución de la tercera, cuarta, etc. ocurrencia de
temp
. Pero se puede hacer si insiste:fuente
sed
aplica secuencias de comandos a cada línea de entrada a su vez.sed
igual que puede canalizarlas a cualquier otro programa. FI::%!sed 's/\.temp\././2'
.sed
en UNIX-friendly, lee entradasstdin
y escribe resultados enstdout
.También puede hacer esto con un vistazo atrás.
Si desea eliminar TODAS las ocurrencias después de la primera, puede agregar la
g
bandera al final.\(\)\@<=
Buscará cualquier patrón entre\(
y\)
pero no agregará el texto encontrado a la coincidencia.Ver
:h \@<=
para más información.fuente
Puede usar una macro como @Meshpi ya sugirió. Pero, esta es otra forma de lograr lo mismo.
Y luego puedes repetirlo hasta el final. Y habrá muchas más formas de hacer lo mismo.
fuente
Esta solución es similar a la de TessellatingHeckler, pero se adapta más fácilmente a cualquier patrón que deba eliminarse.
Así es como funciona:
:g/temp\./
por cada línea que coincida con "temp".normal
ejecute lo siguiente en modo normal2n
encontrar la segunda aparición del patróngn
selecciónalod
y eliminarloEsto funcionará para cualquier patrón que se le dé
:g
.normal
puede ser abreviado anorm
.gnd
es equivalente adgn
. Editar: de hecho2ngnd
es equivalente ad2gn
.Consulte el Wiki de Vim Tips para obtener más ejemplos del comando global.
fuente
En Vim, puede definir la columna antes / en / después de la cual desea que su coincidencia ocurra
:help \%c
:Esto eliminará todos los
.temp
encontrados después de la columna 17 de cada línea en el búfer actual.Nota 1:
/g
no es necesario con su muestra.Nota 2: uso esa característica práctica muy a menudo con qmv . ¡Recomendado!
fuente
vidir
yvipe
desde el paquete moreutils .Esto es realmente bastante simple. Para hacer coincidir la segunda temperatura, permita cualquier cosa seguida de "temp" seguida de cualquier cosa, luego busque temp nuevamente
Los
\zs
medios "iniciar la selección aquí", de modo que la primera parte del partido (todo antes de la segunda temp) no se quita. En realidad, es una característica extremadamente útil que acabo de aprender. Sin ella, la expresión regular debería verse así:fuente
temp
en una línea, su receta elimina la última, en lugar de la segunda. Culpa a la avaricia. :)My case was to match old filename to new filename, so only 2 occurrences will be on each line. And only the second one should change
.En lugar de expresiones regulares, iría con un comando que hace:
temp
y ejecutarlo en cada línea:
NÓTESE BIEN.
^[
es especial y representa presionar la tecla Escape; lo escribes con:Ctrl-q <Esc>
Pero una opción de expresiones regulares, que no creo que se haya sugerido todavía, es hacer coincidir
temp.
seguido de cualquier cosa, excepto una.
, anclada al final de la línea.Que coincidirá
temp.txt
al final de una línea y lo reemplazará solo con eltxt
bit.fuente
Escribiría una macro con el cursor comenzando en la esquina superior izquierda.
qq4f.dfpq
Luego seleccionaría el resto de las líneas usando
V
y ejecutaría la macro en esas líneas con:'<,'>norm!@q
Esto solo funcionará si el formato de texto permanece igual en relación con el número de puntos antes de la segunda temperatura.
fuente
n
lugar de hacerlo,4f.
porque si un nombre de archivo tiene más puntos, su macro podría fallar o eliminar cosas que no deberían eliminarse.No hay nada que le impida utilizar dos expresiones regulares en lugar de una sola, es decir, cambiar la primera aparición y luego intercambiar las columnas:
Puede que no sea muy inteligente, pero me parece muy legible.
fuente
Mi intento
fuente