Vim recherche en utilisant l'expression régulière

je veux rechercher une chaîne qui commence par "abc" et se termine par "xyz" dans vim.

voici les commandes que j'ai essayé:

:1,$g/abc[wW]*xyz/
:1,$g/abc[wW]*xyz/
:1,$g/abc*xyz/

" [wW]* "signifie que les textes entre" abc "et" xyz " peuvent être tous les caractères

"1,$" signifie que la plage de recherche va de la première ligne à la dernière ligne du fichier ouvert par vim.

j'ai trouvé que le modèle de recherche

abc[wW]*xyz 

travaille à https://regex101.com/

pourquoi est-ce qu'il échoue dans vim?

10
demandé sur Brian 2015-06-22 11:37:44

4 réponses

la commande ci-dessous devrait fonctionner sauf si "any character" signifie quelque chose de différent pour vous que pour Vim:

:g/abc.*xyz
  • . signifie "tout caractère sauf une fin de vie".
  • * signifie "n'importe quel nombre (y compris 0) de l'atome précédent".
  • 1,$ pourrait être réduit à %.
  • :global fonctionne sur l'ensemble du buffer par défaut donc vous n'avez même pas besoin du %.
  • clôture / n'est pas nécessaire si vous ne suivez pas :g/pattern par une commande comme suit::g/foo/d.
15
répondu romainl 2015-06-22 09:25:29

une Fois que le fichier est trop grand (disons, de 1 go), ":g/abc.* xyz " devient assez lent.

j'ai trouvé que

cat fileName | grep abc | grep xyz >> searchResult.txt

est plus efficace que d'utiliser la fonction de recherche dans vim.

je sais que cette méthode peut retourner les lignes qui commencent par "xyz" et finit par "abc".

mais comme c'est un cas rare dans mon dossier(et peut-être que cela n'arrive pas souvent pour d'autres personnes), je pense que je devrais écrire cette méthode ici.

1
répondu Brian 2015-06-24 05:43:00

il semble que dans la syntaxe de la collection [..], des classes de caractères telles que \w ne peut pas être utilisé, probablement parce qu'il teste par la stratégie caractère par caractère. À partir de :h /[]:

L'appariement avec une collection peut être lent, parce que chaque caractère le texte doit être comparé avec chaque personnage dans la collection. Utilisez l'une des autres atomes ci-dessus si possible. Exemple: "\d" est beaucoup plus rapide que "[0-9]" et correspond à la même caractère.

Vous pouvez, cependant, utiliser des fonctionnalités similaires spécifiquement préparé pour [..] syntaxe. À partir de :h /[] nouveau :

une expression de classe de caractères est évaluée à l'ensemble des caractères appartenant à cette classe de personnage.

exemples:

[:alnum:]     letters and digits                   
[:alpha:]     letters                              
[:blank:]     space and tab characters             
[:cntrl:]     control characters                   
[:digit:]     decimal digits                       
[:graph:]     printable characters excluding space 
[:lower:]     lowercase letters
0
répondu Yosh 2017-05-23 12:06:02

Si vous voulez trouver un par un, vous pouvez appuyer sur

/

et puis écrire

abc.*xyz

et appuyez sur enter pour trouver la première occurrence du motif. Ensuite, utilisez n pour la prochaine occurrence et Shift + n pour la précédente. C'est ce que je fais habituellement, car pour moi c'est plus facile de modifier ces lignes.

0
répondu mCeviker 2018-07-12 17:34:33