Pour utiliser grepdeux lignes différentes, recherchez les deux modèles
$ grep -e sweet -e lemon file_type
This is a sweet
lemon.
Ou utilisez l'alternance
$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.
Pour obtenir la ligne suivante après un modèle, vous pouvez utiliser l'option contextuelle
$ grep -A1 sweet file_type
This is a sweet
lemon.
Mais si vous recherchez explicitement un modèle multiligne, qui est parce que délicate greppense en lignes ... . Votre .*attrapera tout entre "sucré" et "citron" sur la ligne . Nous pouvons obtenir "citron" sur la ligne suivante en -Putilisant \npour faire correspondre la nouvelle ligne et en disant que greple fichier est nul avec -z:
$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.
Remarques:
-EUtilisez des expressions régulières étendues (pour utiliser le |caractère pour l'alternance sans avoir besoin de l'échapper)
-An Imprimer des lignes supplémentaires après le motif, où n est le nombre de lignes de fin à imprimer
-PUtilisez des expressions régulières de style perl («expérimental» dans grep- installer à la pcregrepplace pour une meilleure prise en charge des expressions rationnelles perl)
-zUtilisez le caractère nul comme séparateur (prétendant juste dans ce cas, mais grepnous prendrons notre parole)
Alors que la grep -zPcommande fonctionnerait dans ce cas spécifique (un fichier composé exactement de deux lignes), elle considérerait en général tout fichier ordinaire séparé par des sauts de ligne comme une seule ligne, donc soit vider tout le contenu du fichier (s'il y a une correspondance quelque part) ou rien; ce n'est généralement pas ce que les gens utilisent grep.
Marc van Leeuwen
ouais ce n'est utile qu'avec -o... édité ...
Zanna
Dans le cas où cela est essayé sur d'autres distributions, vous pouvez rencontrer: grep: The -P and -z options cannot be combined- par exemple grep (GNU grep) 2.5.1 sur RHEL
désolé mais cela correspondra exactement à "sweet | lemon"
αғsнιη
4
@KasiyA Cette ligne fonctionne bien. greppar des œuvres par défaut en mode « standard », où « caractères spéciaux » comme |, +, *sont interprétés littéralement à moins qu'ils masqués par une barre oblique inverse. Voir par exemple cette réponse . Pour utiliser la façon dont vous êtes probablement habitué, que les "caractères spéciaux" doivent être masqués pour être interprétés littéralement, vous devez passer en "mode étendu" ( grep -E). Peut-être que madneon pourrait élaborer un peu plus sur ses réponses, par exemple ce que les PO auraient essayé ?
grep -zP
commande fonctionnerait dans ce cas spécifique (un fichier composé exactement de deux lignes), elle considérerait en général tout fichier ordinaire séparé par des sauts de ligne comme une seule ligne, donc soit vider tout le contenu du fichier (s'il y a une correspondance quelque part) ou rien; ce n'est généralement pas ce que les gens utilisentgrep
.-o
... édité ...grep: The -P and -z options cannot be combined
- par exemple grep (GNU grep) 2.5.1 sur RHELComme ça:
la source
grep
par des œuvres par défaut en mode « standard », où « caractères spéciaux » comme|
,+
,*
sont interprétés littéralement à moins qu'ils masqués par une barre oblique inverse. Voir par exemple cette réponse . Pour utiliser la façon dont vous êtes probablement habitué, que les "caractères spéciaux" doivent être masqués pour être interprétés littéralement, vous devez passer en "mode étendu" (grep -E
). Peut-être que madneon pourrait élaborer un peu plus sur ses réponses, par exemple ce que les PO auraient essayé ?