Tengo un archivo de texto como este (usando gVim en Windows)
foo bar baz quux
corge grault garply
waldo fred plugh
[...150 more lines...]
xyzzy thud
Quiero agregar un número a cada línea en el archivo. No se usa :set number
, sino para agregar el número como texto que precede a cada línea, de la siguiente manera, para que el número sea parte del archivo.
1. foo bar baz quux
2. corge grault garply
3. waldo fred plugh
[...~150 more lines...]
155. xyzzy thud
macro
text-generation
enumerate
roblogic
fuente
fuente
awk
Es probablemente la herramienta para este trabajo. Pero estoy en Windows (suspiro).cat
onl
, que pueden hacer líneas numéricas, pero generalmente no están disponibles en Windows (como OP indica en su comentarioawk
). Las dos soluciones principales son Vim puro. Por último, todas las líneas frente a un párrafo son solo una cuestión de selección de rango. Claramente no es un gran problema.Respuestas:
En la moda pura de Vim:
Explicación:
Ver
:help \=
y:help line()
.Usar una expresión en la parte de reemplazo es muy poderoso y FWIW es un punto de entrada bastante bueno para vimscript.
fuente
:help sub-replace-expression
Una cosa buena de las macros de Vim es que pueden recurrir (pueden invocarse):
qqq
ggI1.
(¡no olvide el espacio!)0qq
yW
+P
0<c-a>
0
@q
.q
@@
La macro continuará invocando hasta que llegue al final del archivo.
Puede utilizar el truco macro recursivo para muchos otros problemas similares, por lo que es bueno tenerlo en cuenta.
Si no desea utilizar una macro recursiva por alguna razón, puede omitir los pasos 1 y 8, y usar un conteo para ejecutar la macro varias veces, por ejemplo
100@q
, ejecutará la macroq
100 veces.fuente
Me gusta usar el comando global vim para realizar tareas como esta. Esto se aplica a agregar iteraciones al comienzo de una línea o modificar un símbolo en el texto. Parece más complicado que las otras soluciones, pero es un patrón bastante flexible para usar cuando lo tiene a mano, y es fácil de modificar sin pensarlo demasiado.
Primero, elija su rango (qué líneas desea aplicar esto). Usualmente uso marcas (por ejemplo,
ma
en la primera línea ymb
en la segunda, pero también puede usar números de línea o selección visual), luego ingreso una modificación del siguiente comando (actualmente ajustado para su caso de uso)Deconstruccion
Esto configura una variable
i
con un valor inicial. Por lo general, las listas comienzan con 1, por lo que estoy configurando i en 1.La barra inicia un nuevo comando
Esto establece el rango del siguiente comando. Voy de marca
a
en marcab
, que se establecería en la primera línea y la última línea de su lista.Este es el comando global. Busca en el archivo (o rango) una expresión regular dada y ejecutará el resto de la línea de comando en cada una de las líneas que coincidan. Estoy haciendo coincidir cada línea buscando "comienzo de línea". Si tuvieras texto como
y solo desea poner estas etiquetas al frente
Item
e ignorar las otras líneas, hacerg/Item/
o en sug/^Item/
lugar (asumiendo el texto literal del elemento)Esto ejecuta la expresión regular para reemplazar el comienzo de la línea con el valor de
i
concatenado con a.
. Generalmente puede hacer esto a cualquier cosa (Item
por ejemplo, reemplace la etiqueta con el número).Aunque la barra inicia un nuevo comando, configura un segundo comando para que se ejecute dentro del comando global, en lugar de después de que se complete el comando global. El resultado es que incrementamos
i
antes de que la siguiente línea sea procesada por g. Aquí hay otro lugar de flexibilidad. La modificación de i puede ser cualquier cosa (incremente en 2, llame a una función que genere el siguiente elemento de la secuencia de Fibonacci, lo que sea).fuente
Agregar números a todas las líneas
Es posible usar
:%!nl -ba
o:%!cat -n
comandos que agregarán números de línea a todas las líneas.En Windows, debe tener instalado Cygwin / MSYS / SUA.
Agregar números a las líneas seleccionadas
Para agregar números solo para las líneas seleccionadas, selecciónelas en modo visual ( vy cursores), luego, cuando haya terminado, ejecute el comando:
:%!nl
(ignore las líneas en blanco) o:%!cat -n
(líneas en blanco incluidas).Formateo
Para eliminar espacios adicionales, selecciónelos en el bloque visual ( Ctrl+ v) y elimínelos ( x).
Para agregar algunos caracteres (
.
,:
,)
) después de los números, seleccionarlos en el bloque visual ( Ctrl+ v), tiene que poner el carácter ( A, escriba el carácter, y luego terminar con Esc).fuente
Una modificación de la respuesta de romainl :
Esto no solo agregará números de línea, sino que también reemplazará los números de línea existentes si ya están allí. De, si ha insertado una línea a mitad de camino, volverá a numerar todo como se esperaba.
Esto funciona reemplazando cualquier número seguido de a. y un espacio al comienzo de la línea con un nuevo número. Obviamente, esto se romperá si tienes una línea que ya comienza con este patrón, así que úsala con pensamiento.
La parte agregada:
^
- Inicio de línea\(
- Iniciar nuevo subgrupo\d\+
- Une un dígito una vez o más\.
- Une un punto (
.
) y un espacio.
\)
- Fin de subgrupo\?
- Haga que el grupo sea opcional, para que funcione como antes si todavía no hay un número en esta línea.Sugerencia de bonificación:
para eliminar los números de línea, puede usar el mismo patrón con la parte de repalce vacía:
fuente
Esto numera las dos primeras líneas, y puede presionar
@q
para numerar las líneas siguientes (o escriba ej.18@q
Si desea numerar un total de 20 líneas).Explicación:
El beneficio de esto es que no requiere ningún comando externo, lo cual es útil si está trabajando con Vim en Windows, por ejemplo.
fuente
1. <esc>h
estás en la segunda columna, no en la primera columna. Reemplazaríah
con0
, después de lo cual creo que su solución debería ser muy buena.^
espera un segundo carácter para permitir combinaciones de escritura como^a -> â
. Todavía estoy de acuerdo en que es la mejor solución, pero creo que esto también debería mencionarse.Creo que la respuesta elegida es la mejor, pero en la variedad, ofreceré una alternativa usando un programa externo:
Esto filtrará todo el búfer (como se indica mediante
%
) a través del programa externocat
, donde el-n
indicador antepone cada línea de entrada con un número de línea.Esto, por supuesto, requiere que haya
cat
instalado, lo cual es cierto para (probablemente) todos los sistemas tipo Unix.Consulte
:help :range!
para obtener más detalles sobre el filtrado a través de programas externos.fuente
msysgit
y agregado eso a su PATH (IIRC es una opción de instalación), esta solución también debería funcionar en Windows.cat -n
no es POSIX, pero lonl
es, por lo que podría ser una mejor opción.Una solución poco complicada podría ser la siguiente (todo lo escrito entre <y> debe insertarse después de presionar Ctrl+ v):
Deconstruccion
ejecuta el comando de modo normal en cada línea especificada por el rango, en este caso, cada línea
redirige cada salida realizada por comandos ex al búfer sin nombre.
es un comando ex que genera el número de línea actual (desafortunadamente con una nueva línea anterior)
deja de redirigir al búfer sin nombre
inserta el contenido del búfer sin nombre con a. y una pestaña al frente de cada línea y sale del modo de inserción.
sube una línea y elimina la nueva línea que es el resultado del comando:. =.
fuente