26 votos

¿Cómo puedo obtener Vim para que coincida con una línea de no inicio con un número de siete dígitos?

Tengo un archivo con cerca de 1000 líneas. Todas las líneas que comienzan con un número de siete dígitos, excepto por el ocasional línea. Tengo que coger para estas líneas y en realidad unirse a ellos con la línea anterior.

Me las he arreglado para ser capaz de igualar cualquier línea que comience con un número de siete dígitos mediante la siguiente expresión regular de patrón:

^\d\{7}

Me parece que no puede llegar a coincidir con cualquier línea que no coincide con este patrón, sin embargo, que es realmente lo que yo busco.

Como una segunda pregunta que voy a incluir en este. Es posible que alguna de las líneas que coinciden (o no coinciden para mantener la coherencia con lo que yo estoy tratando de hacer) para que se unan a la línea anterior (en oposición a la J comando que trae la línea siguiente, hasta el actual)?

Gracias

33voto

chaos Puntos 69029
^\(\d\{7}\)\@!

Este es vim sintaxis regex para un negativo de oteo.

Si usted está haciendo esto como una masa : comando, usted debería ser capaz de simplemente hacer

:v/^\d\{7}/-1j

9voto

Kaz Puntos 18072

Ahora, para la verdadera respuesta

La expresión regular que coincide con cadenas que no comienzan con 7 dígitos es muy simple:

.{0,6}([^0-9].*)?

Una más clásico de la expresión regular equivalente sin {} sintaxis es en realidad más fácil de leer: que visualmente nos muestra lo que está pasando:

(|.|..|...|....|.....|......)([^0-9].*)?

I. e. partido entre los 0 y los 6 personajes que pueden ser cualquier cosa, seguido opcionalmente por una que no sea de dígito que, si se produce, puede ser seguido por cero o más caracteres adicionales. Esto garantiza que si una cadena de siete personajes o no coincide, al menos uno de los siete primeros caracteres es una que no sea de dígito.

Para traducir esto a la coincidencia de las líneas en Vim, se agregan algunos escapar y anclaje:

^.\{0,6\}\([^0-9].*\)\?$

Yo no "hacer" \d; es demasiado nuevo de moda. :)

7voto

tobiasvl Puntos 128

La regexp

^\(\d\{7}\)\@!

invertir su expresión original. Para más información sobre esta sintaxis, consulte aquí:

:help \@!

En cuanto al segundo problema, usted podría, por ejemplo, reemplazar la final de salto de línea en las líneas anteriores con nada:

:%s/$\n^\(\d\{7}\)\@!//g

1voto

Hai Vu Puntos 10359

Aquí está mi solución con el uso de awk, que puede ser llamado dentro de vim:

$ cat seven.awk
# Script to join lines that does not start with 7 digits
/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ { print; next }
{ printf $0; getline; print }

$ cat seven.txt
123
4579 bad
7654321 This line is OK
1234567 OK So is this
111
2222 bad again
4443333 OK again

$ awk -f seven.awk seven.txt
1234579 bad
7654321 This line is OK
1234567 OK So is this
1112222 bad again
4443333 OK again

Por favor, disculpe mi torpe expresión: mi awk es vieja y no entiende de lujo expresión del tipo: \d{7}. Si desea invocar este comando desde el interior de vim para todo el archivo:

:%!awk -f seven.awk

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X