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?
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
.
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.
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
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.