Cette question a déjà des réponses ici :

Commentaires

  • Je pense que lautre question est trop spécifique pour être dupliquée. La plupart des réponses à partir dici nont pas ' fonctionner là-bas, car il y a des exigences différentes (en spécifiant des caractères de nouvelle ligne supplémentaires).
  • Je pense ici que le début et les motifs de fin peuvent être nimporte où dans le fichier (pas nécessaire de faire avec de nouvelles lignes) malgré lexemple spécifique, lautre demande les lignes entières.
  • @kenorb it ' est toujours la même idée. Lastuce principale est dutiliser lun des outils qui peuvent faire /foo/,/bar/ pour définir des motifs. Les spécificités du modèle (étant à la fin par exemple) sont secondaires.
  • Cette réponse pourrait également être applicable: stackoverflow.com/a/48022994/ 2026975

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 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *