2010-03-24 16 views
8

Hay algunas preguntas sobre "cómo invierto una expresión regular" aquí en Desbordamiento de pila, pero no puedo encontrar una para vim (si existe, mi Google-fu falta hoy).Invertir expresiones regulares en vim

En esencia, quiero hacer coincidir todos los caracteres no imprimibles y eliminarlos. Podría escribir un guión corto, o colocarlo en un shell y usar tr o algo similar a delete, pero una solución vim sería genial :-)

Vim tiene el átomo \p para que coincida con los caracteres imprimibles, sin embargo, tratando de hacer esto :s/[^\p]//g para que coincida con el error inverso y simplemente me dejó con cada 'p' en el archivo. He visto la secuencia (?!xxx) en otras preguntas, y vim parece no reconocer esta secuencia. No he encontrado visto un átomo para caracteres no imprimibles.

Mientras tanto, voy a caer a herramientas externas, pero si alguien tiene algún truco bajo la manga para hacer esto, sería bienvenido :-)

Ta!

+0

Perl/pcre '(?! Xxx)' expresión tiene el mismo significado que '\ (xxx \) \ @!' Expresión Vim, pero no creo que esto te ayude. – ZyX

Respuesta

10

Desafortunadamente no puede poner \p en clases de caracteres, aunque sería una buena característica. Sin embargo, usted puede utilizar la función de búsqueda hacia delante negativa \@! para construir su búsqueda:

/\p\@!. 

Este primero se asegurará de que el . solamente pueden igualar cuando no es un personaje \p.

+0

Lo más importante: eso hizo el trabajo, aplausos :-) –

1

También estoy un poco desconcertado por qué no puede usar el \ p. Pero, [: print:] funciona bien:

:s/[^[:print:]]//g 
+2

Esto no admite Unicode: 'echo" Å "= ~ '[[: print:]]'" Å "= ~ '\ p'' da como resultado' 0 1'. – ZyX

+2

@ZyX: Buena captura. Me pregunto por qué '[: print:]' no incluye caracteres Unicode imprimibles. – Cascabel

+0

(Dos años después) ... No recuerdo de qué versión de Vim originalmente hice esta pregunta, pero a partir de vim 7.3 (lo que tengo instalado en este momento), '[: print:]' no es compatible con Unicode , y lo anterior de @ZyX ahora (correctamente) devuelve '1 1'. –

1

Si desea filtrar los archivos de Unicode (sólo si fileEncoding = UTF-8) caracteres imprimibles, que podrían hacerlo en tres pasos: marcar todos los caracteres imprimibles con no usada UTF-8 símbolos (por ejemplo, con nr2char(0xFFFF)), borrar todos los caracteres, que no se siguen por este símbolo y, por último, eliminar este símbolo:

%s/\p\@<=/<ffff>/g 
%s/[^<ffff>]<ffff>\@!//g 
%s/<ffff>//g 

Aquí debe reemplazar <ffff> con el carácter real (si escribe esto, en lugar de <ffff> escriba).

Si no está trabajando con Unicode, utilice la respuesta de dsummersl.

Cuestiones relacionadas