6 votes

Dans Vim, comment supprimer tous les mots et caractères qui ne correspondent pas à un modèle ?

J'ai cherché sur Google à plusieurs reprises au fil des ans et je n'ai pas trouvé de solution satisfaisante.

Je veux pouvoir supprimer tous les mots et toutes les ponctuations qui ne correspondent pas à un modèle.

Disons que j'ai cette liste

 R61,1,BWRBW0471,1
 R14,1,BWRBW0471,1
 R162,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1
 R61 ,1,BWRBN0471,1

Je veux supprimer tout ce qui n'est pas bwrb.*471,[0-9], il me reste donc

BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1
BWRBW0471,1

Existe-t-il une commande VIM facile à réaliser ?

Merci.

15voto

Craig McQueen Points 13194
:%s/\v(.*)(bwrb.*471,\d)(.*)/\2

fait ce que vous voulez avec votre échantillon. Il faudra probablement le modifier si vos besoins réels sont plus complexes.

En fait, le motif correspond à la ligne entière, mais nous utilisons le regroupement pour séparer ce que nous voulons de ce que nous ne voulons pas. Nous obtenons trois groupes, " avant ce que nous voulons ", " ce que nous voulons ", " après ce que nous voulons " et nous remplaçons la ligne entière par le deuxième groupe, noté \1 .

Pas à pas :

  • %s/

    La substitution se fait sur l'ensemble du fichier.

  • \v

    Le drapeau "very magic" est utile pour limiter le nombre de antislashs et améliorer la lisibilité.

  • (.*)

    Le premier groupe contient un nombre quelconque de n'importe quel caractère. L'ancrage au début de la ligne est implicite, de sorte qu'il correspond à tout ce qui est avant ce que vous voulez. Ce serait \(.*\) sans le drapeau "très magique".

  • (bwrb.*471,\d)

    Voici le deuxième groupe : votre modèle. La seule chose que j'ai changée est [0-9] que j'ai remplacé par l'équivalent mais plus court \d .

  • (.*)

    Le troisième groupe contient un nombre quelconque de n'importe quel caractère jusqu'à la fin de la ligne.

  • /\2

    La pièce de rechange n'existe que dans le deuxième groupe.

3voto

jaume Points 5382

J'utiliserais cette commande :

%s/.*\(BWRB.*471,[0-9]\).*/\1

% : appliquer la commande à toutes les lignes du fichier.

s/pattern/replacement/ : commande de remplacement à utiliser avec sed :

  • .* correspond à n'importe quel caractère jusqu'à ce qu'une sous-chaîne correspondant à \(BWRB.*471,[0-9]\) est trouvé. Tous les caractères après la sous-chaîne sont recherchés par .* . Les parenthèses indiquent vi pour enregistrer la sous-chaîne.

  • Le remplacement \1 imprime la sous-chaîne précédemment sauvegardée, qui supprime en fait tous les caractères indésirables de la ligne.

Par exemple, ce fichier (qui est votre exemple légèrement modifié) :

R61,1,BWRBW0471,2
R14,1,BWRBW0471,5
R162,1,BWRBN0471,0
R61 ,1,BWRBN0471,4
R61 ,1,BWRBN0471,1
R61 ,1,BWRBN0766471,1

est converti en :

BWRBW0471,2
BWRBW0471,5
BWRBN0471,0
BWRBN0471,4
BWRBN0471,1
BWRBN0766471,1

2voto

Mono Points 824
Je ne sais pas exactement quelle est la variabilité qui précède vos cordes, mais il semble que vous souhaitiez simplement "remplacer jusqu'à BWRB sur chaque ligne".

%s/.* \zeBWRB //g

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X