2010-03-24 7 views
8

Il y a quelques questions "comment inverser un regexp" ici sur Stack Overflow, mais je ne peux pas en trouver une pour vim (si elle existe, mon Google-fu fait défaut aujourd'hui).Inverser regexp dans vim

Essentiellement, je veux faire correspondre tous les caractères non imprimables et les supprimer. Je pourrais écrire un court script, ou passer à un shell et utiliser tr ou quelque chose de similaire à supprimer, mais une solution vim serait dandy :-)

Vim a l'atome \p pour faire correspondre les caractères imprimables, mais en essayant de le faire :s/[^\p]//g pour correspondre à l'inverse a échoué et me laisse juste avec chaque «p» dans le fichier. J'ai vu la séquence (?!xxx) dans d'autres questions, et vim ne semble pas reconnaître cette séquence. Je n'ai pas vu un atome pour les caractères non imprimables.

En attendant, je vais tomber à des outils externes, mais si quelqu'un a obtenu des trucs dans leur manche pour ce faire, ce serait la bienvenue :-)

Ta!

+0

L'expression Perl/pcre '(?! Xxx)' a la même signification que l'expression '\ (xxx \) \ @!' Vim, mais je ne pense pas que cela vous aidera. – ZyX

Répondre

10

Malheureusement, vous ne pouvez pas mettre \p dans les classes de caractères, bien que ce serait une fonctionnalité intéressante. Cependant, vous pouvez utiliser la fonction négative \@! pour construire préanalyse votre recherche:

/\p\@!. 

Cela va d'abord faire en sorte que le . ne peut égaler quand il est pas un caractère \p.

+0

Top choses - qui a fait le travail, applaudissements :-) –

1

Je suis également un peu perplexe pourquoi vous ne pouvez pas utiliser le \ p. Mais, [: print:] fonctionne très bien:

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

Ceci ne supporte pas unicode: 'echo" Å "= ~ '[[: print:]]'" Å "= ~ '\ p'' donne' 0 1'. – ZyX

+2

@ZyX: Bonne prise. Je me demande pourquoi '[: print:]' n'inclut pas les caractères Unicode imprimables? – Cascabel

+0

(Deux ans plus tard) ... Je ne me souviens plus de la version de Vim que j'ai posée à l'origine, mais à partir de vim 7.3 (ce que j'ai installé pour l'instant), '[: print:]' supporte Unicode , et le ci-dessus de @ZyX maintenant (correctement) renvoie '1 1'. –

1

Si vous souhaitez filtrer fichier Unicode (uniquement si fileencoding = utf-8) caractères imprimables, vous pouvez le faire en trois étapes: marquer tous les caractères imprimables avec Inutilisé Symbole UTF-8 (par exemple, avec nr2char(0xFFFF)), supprimer tous les caractères, qui ne sont pas suivies par ce symbole et, enfin, supprimer ce symbole:

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

vous devez remplacer <ffff> avec le caractère réel (si vous tapez ceci, au lieu de <ffff> tapez).

Si vous ne travaillez pas avec Unicode, utilisez la réponse de dsummersl.