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
\zsy\{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
sedaplica secuencias de comandos a cada línea de entrada a su vez.sedigual que puede canalizarlas a cualquier otro programa. FI::%!sed 's/\.temp\././2'.seden UNIX-friendly, lee entradasstdiny 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
gbandera 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".normalejecute lo siguiente en modo normal2nencontrar la segunda aparición del patróngnselecciónalody eliminarloEsto funcionará para cualquier patrón que se le dé
:g.normalpuede ser abreviado anorm.gndes equivalente adgn. Editar: de hecho2ngndes 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
.tempencontrados después de la columna 17 de cada línea en el búfer actual.Nota 1:
/gno es necesario con su muestra.Nota 2: uso esa característica práctica muy a menudo con qmv . ¡Recomendado!
fuente
vidiryvipedesde 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
\zsmedios "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
tempen 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:
tempy 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.txtal final de una línea y lo reemplazará solo con eltxtbit.fuente
Escribiría una macro con el cursor comenzando en la esquina superior izquierda.
qq4f.dfpqLuego seleccionaría el resto de las líneas usando
Vy ejecutaría la macro en esas líneas con:'<,'>norm!@qEsto solo funcionará si el formato de texto permanece igual en relación con el número de puntos antes de la segunda temperatura.
fuente
nlugar 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