rechercher des lignes qui contiennent un motif mais ne contiennent pas de deuxième motif

15

J'ai besoin de rechercher des lignes contenant un mot mais pas un deuxième mot.

Par exemple, recherchez les lignes qui contiennent le mot «ceci» mais pas le mot «rouge»

de sorte que pour un fichier contenant ces lignes

This is a blue coat
This is a red  coat
This is a purple coat
That is a coat

La recherche localiserait uniquement les première et troisième lignes.

Merci pour tout conseil!

Leo Simon
la source
Vous pouvez utiliser le plugin LogiPat qui est distribué avec les nouveaux Vims
Christian Brabandt

Réponses:

23

Vous pouvez utiliser cette commande pour imprimer des lignes contenant Thiset non red:

:g/\(.*This\)\&\(.*red\)\@!
  • \&sépare les branches comme une logique ANDparce que nous voulons les lignes qui remplissent les deux conditions (branches),
  • \(.*This\)est la première branche, ça pourrait être tout simplement Thismais c'est plus générique de cette façon,
  • \(.*red\)\@!est la deuxième branche, \@!signifie "correspondance de largeur nulle si l'atome précédent ne correspond pas", comme une logique NOT.

En d'autres termes:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'
romainl
la source
Merci beaucoup, cela ressemble beaucoup à une requête sur du texte formaté. J'ai pu l'utiliser pour trouver des fonctions manquant aux docstrings.
Joshua Detwiler
1

Jetez un oeil à ce post.

Combinez-le avec la réponse @romainl et vous pouvez faire ce que vous voulez.

Exemple: disons que je veux ajouter un constaux fonctions qui n'en ont pas.

    handleChange = value => {

Script VIM:

%s/\([ ]*\)\(\w* = .*$\)\&^\(\&\(.*const.*\)\@!.\)*$/\1const \2/gc

Production:

    const handleChange = value => {

Explication:

\([ ]*\)\(\w* = .*$\)

- obtenez-moi toutes les lignes qui ont word =

\&

- combiner les règles

^\(\&\(.*const.*\)\@!.\)*$

- la ligne ne doit pas contenir const.

ATOzTOA
la source