9
votes

Emacs: Recherche inverse

Y a-t-il un moyen de faire une recherche inverse? J'ai un très gros fichier journal où un motif particulier se remplit de quelques douzaines de pages xxx

est, je ne sais pas quel texte serait après "alpha beta". Cela pourrait être "gamma delta" ou autre chose. Je voudrais donc sauter toutes les lignes contenant "alpha beta".


1 commentaires

J'ai découvert cette question à l'aide de Google. Ma requête était "Emacs Recherche première ligne qui ne correspond pas". Je pense que le texte de la question est correct et les réponses sont bonnes. Mais je ne suis pas sûr que le titre de la question soit le bon. Je ne suis pas un orateur anglais natif (je suis français) et "la recherche inverse" pour moi signifie "la recherche en arrière". Ai-je raison? Qu'est-ce qui pourrait être un bon titre pour la question?


6 Réponses :


1
votes

Je résolvez généralement cela en utilisant une recherche REGEXP

C-u C-r ^20100414 [^a]


3 commentaires

@RYANTHOMPSON Vous entourez le texte avec un boîtier 'KBD' comme: quelque chose .


Comment cette recherche est-elle excluant les tonnes de lignes que nous souhaitons rechercher?


@Nikanareklawyks Il recherche la première ligne qui commence par '20100414' suivie de quelque chose d'autre qu'un "A". Étant donné que ses données sont tellement structurées, cela trouve essentiellement la première ligne qui n'est pas «20100414 alpha beta» - évidemment, il ignorait «20100414 Apple», donc en fonction de la détaillée que vous souhaitez obtenir vous pouvez personnaliser la chaîne de recherche de manière appropriée.



7
votes

Deux idées:

  1. M-x Garder-lignes REGEXP

    supprimera toutes les lignes ne correspondant pas à une régexp

  2. m-x grep grep -nh -e "" -v

    trouvera toutes les lignes de ne pas contenir votre régexp.


1 commentaires

FWIW FLUSH-LINE Est-ce que l'inverse de Garder-lignes I.e. Il supprime les lignes correspondantes.



2
votes

En général, vous ne pouvez pas effectuer une recherche inverse, mais pour votre cas particulier, vous pouvez utiliser une fonction simple:

(defun my-skip-lines-matching-regexp (regexp)
  "Skip lines matching a regexp."
  (interactive "sSkip lines matching regexp: ")
  (beginning-of-line)
  (while (and (not (eobp)) (looking-at regexp))
    (forward-line 1)))


0 commentaires

3
votes

Vous pouvez utiliser Hide-Lines: http://www.emacswiki.org/ emacs / cache-lignes.el

ALORS M-X Hide-Lines de RET Alpha Beta RET cachera toutes les lignes contenant "alpha beta".

Maintenant, vous pouvez rechercher en utilisant E.G. C-S ...


1 commentaires

Il est similaire à des lignes de garde et de rinçages, mais cela ne modifie pas le tampon.



0
votes

Vous pouvez également rechercher en utilisant grep , spécifiant que vous souhaitez les lignes qui font pas match.

Vous pouvez également rechercher en utilisant icicle-survoir , en utilisant c- ~ pour supprimer les lignes correspondant à ce que vous tapez.

http://www.emacswiki.org/emacs/icles_-_search_commands%2C_Overview < / a>


0 commentaires

0
votes

Une méthode heuristique qui s'avère souvent utile, c'est de passer à la fin du fichier, puis de rechercher en arrière pour le texte que vous souhaitez sauter. Le succès de cette méthode dépend évidemment du contenu du fichier et fonctionne mieux lorsque le texte répété en question se produit dans des morceaux singuliers.


0 commentaires