web-dev-qa-db-fra.com

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ées:

:1,$g/abc[\w\W]*xyz/
:1,$g/abc\[\\w\\W\]\*xyz/
:1,$g/abc*xyz/

"[\ w\W] *" signifie que les textes entre "abc" et "xyz" peuvent être n'importe quels caractères

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

J'ai trouvé que le motif de recherche 

abc[\w\W]*xyz 

fonctionne dans https://regex101.com/

pourquoi échoue-t-il dans vim?

11
Brian

La commande ci-dessous devrait fonctionner à moins que "n'importe quel caractère" ne veuille rien dire de plus que pour Vim:

:g/abc.*xyz
  • . signifie "tout caractère sauf un EOL".
  • * signifie "n'importe quel nombre (y compris 0) de l'atome précédent".
  • 1,$ pourrait être réduit à %.
  • :global fonctionne sur la totalité du tampon par défaut, vous n'avez donc même pas besoin du %.
  • Le / de fermeture n'est pas nécessaire si vous ne suivez pas :g/pattern par une commande comme dans :g/foo/d.
16
romainl

Une fois que le fichier devient trop volumineux (par exemple, 1 Go), ": g/abc. * Xyz" devient assez lent.

Je l'ai trouvé

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 renvoyer des lignes commençant par "xyz" et finissant par "abc". 

Mais comme il s'agit d'un cas rare dans mon dossier (et peut-être que cela ne se produit pas assez souvent pour d'autres personnes), je pense que je devrais écrire cette méthode ici.

1
Brian

Il semble qu'à l'intérieur de la syntaxe de collection [..], les classes de caractères telles que\w ne puissent pas être utilisées , probablement parce qu'elles sont testées via une stratégie caractère par caractère. De :h /[]:

La correspondance avec une collection peut être lente, car chaque caractère de le texte doit être comparé avec chaque caractère de la collection . Utilisez l'un des autres atomes ci-dessus lorsque cela est possible. Exemple: "\ d" est beaucoup plus rapide que "[0-9]" et correspond aux mêmes caractères.

Vous pouvez cependant utiliser des fonctionnalités similaires spécialement préparées pour la syntaxe [..]. De :h /[] encore: 

Une expression de classe de caractères est évaluée en fonction du jeu de caractères appartenant à cette classe de personnage.

les exemples comprennent:

[: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
Yosh

Si vous voulez les trouver un à un, vous pouvez cliquer sur

/

et ensuite écrire 

abc.*xyz 

et appuyez sur Entrée 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, il est plus facile de modifier ces lignes.

0
mceviker