Quiero crear un script Vim básico que simplemente elimine n líneas, salte 1 línea y se repita hasta el final del documento. No me interesan las coincidencias específicas, solo quiero eliminar la línea. Por ejemplo; Entonces quiero repetir el comando 3ddj
para todo el documento.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Entonces parece que ...
Text I want to keep.
Text I want to keep.
Text I want to keep.
Gracias.
regular-expression
normal-mode
repeated-commands
Max Copley
fuente
fuente
regular-expression
en su pregunta, pero la pregunta no parece especificar una razón para hacerlo con expresiones regulares. Si realmente está buscando algo que use expresiones regulares, stackoverflow.com/questions/17735289/… puede ser de interés. Esa pregunta era sobre Notepad ++, pero la respuesta no usa más que una expresión regular de pcre. (Descargo de responsabilidad: escribí esa respuesta.)Respuestas:
Enfoque muy simple:
qa3ddjq
El paso tres repetirá la macro mil veces o hasta que se encuentre un error. Al presionar el final del archivo (por lo tanto, no hay líneas para eliminar) se produce un error y se cancela la repetición de la macro.
Ver
:help recording
.fuente
q
(en modo comando, y en vim u otras versiones alternativas recientes [neovim, etc.], pero no en el vi original) significa "comenzar a grabar, y ponerlo en el búfer 'siguiente letra'". por lo tanto:qa
significa "comenzar a grabar en el búfer 'a'". Luego,q
se registran todas las teclas escritas después de esto (hasta la siguiente en modo comando) (incluso puede grabar: entrar en modo de edición, escribir algo, escapar al modo de comando, etc.). Luego12@a
repetiría cualquier acción registrada en el búfer "a" 12 veces.1000@q
al final, puede hacer una macro recursivaqa3ddj@aq@a
, aunque es posible que deba hacerloqaq
primero para asegurarse de que"a
comienza vacío.La solución más fácil para mí sería:
Es decir:
%
: para cada líneanorm
: ejecuta las siguientes teclas como en modo normalj3dd
: bajar en línea y luego eliminar 3 líneasEntonces, desde la primera línea, vaya a la segunda y elimine las siguientes 3 líneas. El segundo
Text I want to keep.
ahora está en la segunda línea. Baje una línea, elimine 3. Enjuague y repita.Nota: si no desea procesar todo el archivo, puede reemplazarlo
%norm
con, por ejemplo,5,$norm
para procesar desde la quinta línea hasta el final del archivo.fuente
Ya tienes algunas excelentes soluciones disponibles. Aquí hay otro:
Primero, realizamos una acción en cada línea (
:g
haciendo coincidir el^
(inicio de línea)) y para cada número de línea realizamos el resultado delinenumber % 4
. Si el resultado es desigual1
, agregamosDELETE ME
al principio de la línea, marcando las líneas que se eliminarán con el siguiente comando.El siguiente comando es un comando regular (
:g
), que coincide con todas las líneas que comienzan conDELETE ME
y lo hace.Tenga en cuenta que no puede eliminar inmediatamente la línea con el primer
:g
comando, ya que esto cambiaría el cálculo del módulo resultante y, como tal, primero debemos marcar las líneas y, en un segundo paso, eliminarlo.fuente
Sé que este es el
vi
canal, pero para mí esto es unsed
problema.Para que pueda organizarlo en una
vi
solución:fuente
Una alternativa (supongo que comenzamos en la línea 1, y eliminamos las líneas 2-4, 6-8 y así sucesivamente, según un texto de ejemplo):
Si prefiere hacerlo de forma interactiva, puede utilizar el "registro de línea de comandos". Es decir, presione
:+1del 3<CR>
y entonces1000@:
fuente
Una alternativa: desea mantener las líneas: 1, 4, etc. Puede utilizar:
Otra alternativa: si conoce las líneas que desea que coincidan con algún patrón único:
fuente