Comment rechercher une phrase sur plusieurs lignes? Par exemple, laisse l'expression "mon thé glacé" puis il peut être enveloppé dans des fichiers texte:
as js skdfh dfh djh sf my
ice tea.
grep ne correspondra pas car il y a une nouvelle ligne entre les deux. Comment puis-je les assortir? Un autre modèle multiligne seraitpattern1_\n_pattern2
Je sais que la façon la plus simple de faire de l'ATM est juste de grep pour une partie par exemple juste de la glace avec le drapeau -A2 -B2 et ensuite dans cette sortie againg pour par exemple le thé. Mais c'est très fastidieux. Je suis donc intéressé par la façon de résoudre ce problème.
Réponses:
Vous pouvez installer
pcregrep
(disponible dans la plupart des dépôts distro) - qui est grep en utilisant la bibliothèque pcre , qui fait "des expressions régulières compatibles Perl". Il a une option de ligne de commande-M
qui vous permet de faire des recherches multilignes - à partir de la page de manuel :Donc tu pourrais faire
L'
\s
espace est, qui correspondra\n
et\r
en mode multiligne, en plus des espaces blancs normaux. Vous pouvez également faire correspondre directement le caractère de nouvelle ligne, vous pouvez doncla source
grep -E
motifs pcre??
,+
,{
,|
,(
et)
leur sens habituel regex sans avoir à un\
devant, comme vous le faites si vous utilisez grep standard.grep 'hello\s\+world' file
Est donc équivalent àgrep -E 'hello\s+world' file
. Il ne fait pas PCRE. Il y agrep -P
des expressions régulières pour perl, mais c'est expérimental (selon la page de manuel) et je pense que c'est un peu différent de pcregrep ...-P
quand j'ai dit-E
, mais je ne savais pas que c'était différent.Je ferais probablement une recherche en utilisant
vim
la:vimgrep
commande de. Cela fonctionne d'une manière vaguement similaire à celle degrep
mais prend en charge les RE et les chemins vim.Fondamentalement, vous exécutez quelque chose comme
:vimgrep 'pattern1\npattern2' path/**
pour une recherche récursive, puis tapez:copen
pour afficher une fenêtre plus petite contenant une liste de correspondances.vim
Les RE peuvent faire presque tout ce que les PCRE peuvent faire, mais ils ont évolué séparément de la lignée d'expressions régulières perl, donc la plupart des choses avancées fonctionnent différemment. Leur fonctionnalité de base ressemble plus à celle des RE de base, mais ils ont quelques ajouts astucieux que les PCRE n'offrent pas.Je ne sais pas s'il est possible
:vimgrep
de cracher des données commegrep
ça; Je n'ai essayé que de l'utiliser pour naviguer à l'intérieurvim
.:help vimgrep
de l'intérieurvim
pour plus d'informations;:help pattern.txt
pour plus d'informations sur lesvim
RE; pour plus d'informations sur les chemins voir:help wildcards
.la source
.vimrc
? Il devrait être plus portable quegrep
par rapport au système d'exploitation:vim
n'a pas de "saveur POSIX", et fonctionne plus ou moins à l'identique même sous Windows. .................................................. ........................... Il est possible d'ajouter des qualificatifs pour s'assurer par exemple que la bonne quantité de "magie" est utilisée sur le RE, bien que si je comprends bien, il existe une règle stricte non écrite pour laisser cette option de côté.find.exe
au lieu degrep
). Il y avait une autre question au cours des dernières semaines qui avait ce problème.:vimgrep
ou:grep
? De:help grep
: "L'avantage du grep interne [ie:vimgrep
] est qu'il fonctionne sur tous les systèmes et utilise les puissants modèles de recherche Vim."Grep ne fonctionne que sur une ligne à la fois, mais vous pouvez utiliser awk pour imprimer des lignes correspondant à une gamme de motifs:
il correspondrait à n'importe quoi, pas seulement à des sauts de ligne entre les deux modèles
la source
Pour tirer le meilleur parti d'Unix, vous devez profiter des tuyaux. Vous pouvez le faire en clair à l'
grep
aide de tuyaux (pas besoin de tee):Ce que je ne considérerais pas comme fastidieux.
la source