Commentaires
Réponse
grep
a gagné » t vous aider ici. Cest un travail mieux accompli avec sed
en utilisant des expressions de plage:
$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke
sed -n
supprime limpression automatique, de sorte que les lignes sont imprimées juste si cela est explicitement demandé. Et cela se produit lorsque la plage /aaa/,/cdn/
se produit.
Ces expressions de plage sont également disponibles dans awk
, où vous pouvez dire:
awk "/zdk/,/dke/" file
Bien sûr, tout ces conditions peuvent être étendues à une expression régulière plus stricte comme sed -n "/^aaa$/,/^cdn$/p" file
pour vérifier que les lignes consistent exactement en aaa
et cdn
, rien dautre.
Commentaires
- Wow, jai eu le même problème et je nai ' pas demandé. Jai utilisé 2 instances de
grep -n
et comparé le nombre de ma solution. - Les expressions de plage @KipK sont un outil tellement utile pour ce genre de problèmes:) Vous pouvez utilisez également
awk
et quelques drapeaux, mais le cas de base est assez simple avec ceci. - @Fedorqui, jobtiens un problème si le modèle de recherche contient xmls. comme, je dois rechercher en commençant par < ns0: abcd xmlns = " " >, obtenant le résultat. Mais il affiche < abcd xmlns = " " > aussi. Jai essayé sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p fichier
- @MukulAnand veuillez fournir un exemple afin que nous puissions contre-vérifier
- Comment faire pour pas imprimer le motif de début et de fin eux-mêmes (sauf pour lutilisation de la tête et de la queue)?
Réponse
Il peut être effectué par sed
sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file
Réponse
Voici la commande grep
:
grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n"
Vous pouvez obtenir une correspondance multiligne dans grep
, mais vous devez utiliser perl-regexp pour grep
(-P
– qui nest pas pris en charge sur toutes les plates-formes , comme OS X), donc pour contourner le problème, nous « remplaçons les nouvelles lignes par le caractère _
et après grep
, nous les modifions à nouveau.
Vous pouvez également utiliser pcregrep
qui prend en charge les modèles multilignes (-M
).
Ou utilisez ex
:
ex +"/aaa/,/cdn/p" -scq! file
/foo/,/bar/
pour définir des motifs. Les spécificités du modèle (étant à la fin par exemple) sont secondaires.