Comment faire une recherche multiligne en moins?

18

Dans less, pouvez-vous rechercher à l'aide /d'un modèle contenant un retour chariot et une nouvelle ligne? Je sais que votre modèle peut se terminer par une ligne utilisant $(à partir de Comment puis-je inclure les sauts de ligne dans une recherche en moins? ), Mais j'ai besoin que le modèle corresponde au texte qui s'étend sur plusieurs lignes.

J'ai essayé \n, mais cela ne recherche que le npersonnage.

yonran
la source
Avez-vous essayé \n+1 ou plusieurs nouvelles lignes?
Brock Hensley
Quelle distribution Linux, et avez-vous défini la variable d'environnement "MOINS"?
harrymc
@harrymc Comment cela aiderait-il avec la recherche multiligne?
sashoalm
La collecte d'informations.
harrymc
2
Ce n'est pas possible, sur la base d'un examen du code source de less( search.c:search_range()). L'opération de recherche / correspondance est effectuée sur une seule ligne délimitée par un saut de ligne à la fois, vous ne pouvez donc pas faire de correspondance entre les limites de ligne. Voir line.c:forw_raw_line()pour l'implémentation de "readline" comme appelé par search_range.
zackse

Réponses:

7

Il n'est pas possible de faire correspondre les limites des lignes, car la fonction de recherche dans lessfonctionne sur une seule ligne délimitée par des sauts de ligne à la fois. C'est le cas quelle que soit l'implémentation de l'expression régulière du système (GNU, POSIX, PCRE, etc.).

Veuillez noter que je n'ai pas trouvé de référentiel source officiel pour le développement de la ligne principale less, mais à des fins de révision de code ici, les liens qui suivent proviennent de l'arborescence de contributions FreeBSD.

Voir search.c: search_range () pour l'implémentation de l'opération de recherche. La boucle qui y est appelée appelle line.c: forw_raw_line () pour récupérer le prochain bloc de contenu délimité par des sauts de ligne. Ce bloc est passé à match.c: match_pattern () où le modèle de recherche (expression régulière) est exécuté.

Pour faire correspondre plusieurs lignes, vous devrez utiliser un outil différent. Une option consiste à passer dans votre éditeur et à utiliser ses capacités de recherche comme suggéré par d'autres. Vous pouvez appeler l'éditeur en appuyant vsur less.

zackse
la source
2

Je ne sais pas comment le faire dans less, mais vous pouvez accomplir la même chose dans vim.

http://vim.wikia.com/wiki/Search_across_multiple_lines

/PATTERN1\\_.\\{-}PATTERN2

L'atome \\_.trouve n'importe quel caractère, y compris la fin de ligne. Le multi \\{-}correspond le moins possible.

Vam
la source
1
Cela ne répond cependant pas à la question, car il s'agit de moins, pas de vim. Ce devrait être un commentaire.
sashoalm
1
@sashoalm C'est toujours une tentative de réponse, donc je voterais contre, et je continuerais. Les personnes à la recherche d'une solution peuvent ne pas être obligées d'utiliser un seul outil en particulier.
slhck
2

lessutilise la edsyntaxe regex et ne prend malheureusement pas en charge la correspondance multiligne.

https://www.gnu.org/software/gnulib/manual/html_node/ed-regular-expression-syntax.html#ed-regular-expression-syntax

J'espérais trouver cela aussi, ou au moins trouver si ce bit de syntaxe était utilisé dans less:

RE_DOT_NEWLINE Si ce bit est défini, l'opérateur de correspondance avec n'importe quel caractère correspond à une nouvelle ligne; si ce bit n'est pas défini, il ne l'est pas.

Je peux donc utiliser un .+modèle pour faire correspondre les nouvelles lignes. Mais non, ce n'est pas le cas.

stimuler
la source