Diese Frage hat hier bereits Antworten :

Kommentare

  • Ich denke, die andere Frage ist zu spezifisch, um sie zu duplizieren. Die meisten Antworten von hier funktionieren ' dort nicht, da es unterschiedliche Anforderungen gibt (durch Angabe zusätzlicher neuer Zeilenzeichen).
  • Ich denke hier der Anfang und Endmuster können sich an einer beliebigen Stelle in der Datei befinden (was bei neuen Zeilen nicht erforderlich ist), obwohl das andere Beispiel angegeben ist, fragt der andere nach den gesamten Zeilen.
  • @kenorb it ' ist immer noch die gleiche Idee. Der Haupttrick besteht darin, eines der Tools zu verwenden, mit denen /foo/,/bar/ Muster definiert werden können. Die Besonderheiten des Musters (z. B. am Ende) sind zweitrangig.
  • Diese Antwort kann auch zutreffen: stackoverflow.com/a/48022994/ 2026975

Antwort

grep won “ Dies ist eine Aufgabe, die mit sed unter Verwendung von Bereichsausdrücken besser erledigt werden kann:

$ sed -n "/aaa/,/cdn/p" file aaa b12 cdn $ sed -n "/zdk/,/dke/p" file zdk aaa b12 cdn dke 

sed -n unterdrückt das automatische Drucken, sodass Zeilen nur gedruckt werden, wenn dies ausdrücklich angefordert wird. Dies geschieht, wenn der Bereich /aaa/,/cdn/ auftritt.

Diese Bereichsausdrücke sind auch in awk verfügbar, wo Sie sagen können:

awk "/zdk/,/dke/" file 

Natürlich alle Diese Bedingungen können zu einem strengeren regulären Ausdruck wie sed -n "/^aaa$/,/^cdn$/p" file erweitert werden, um zu überprüfen, ob die Zeilen genau aus aaa und , sonst nichts.

Kommentare

  • Wow, ich hatte das gleiche Problem und habe ' nicht gefragt. Ich habe 2 Instanzen von grep -n verwendet und die Nummer für meine Lösung verglichen.
  • @ KipK-Bereichsausdrücke sind ein nützliches Werkzeug für diese Art von Problemen 🙂 Sie können Verwenden Sie auch awk und einige Flags, aber der Grundfall ist damit recht einfach.
  • @Fedorqui, ich bekomme ein Problem, wenn das Suchmuster xmls enthält. Ich muss nach < ns0 suchen: abcd xmlns = " " >, um den Resull zu erhalten. Es wird jedoch < abcd xmlns = " " auch. Ich habe sed -n ' / \ < ns0 \: abcd xmlns \ = \ " \ " \ > /, / \ < ns0 \: abcd \ > / p-Datei
  • @MukulAnund bitte geben Sie ein Beispiel an, damit wir
  • überprüfen können, wie nicht Drucken Sie das Start- und Endmuster selbst aus (außer bei Verwendung von Kopf und Schwanz)?

Antwort

Es kann erfolgt durch sed

sed -n " /^aaa$/,/^cdn$/w output1 /^zdk$/,/^dke$/w output2 " file 

Antwort

Hier ist der Befehl grep:

grep -o "aaa.*cdn" <(paste -sd_ file) | tr "_" "\n" 

Sie können eine mehrzeilige Übereinstimmung in , aber Sie müssen perl-regexp für grep (-P verwenden – dies wird nicht auf jeder Plattform unterstützt , wie OS X), ersetzen wir als Problemumgehung neue Zeilen durch _ Zeichen und Nach grep ändern wir sie wieder.

Alternativ können Sie unterstützt mehrzeilige Muster (-M).

Oder verwenden Sie ex:

ex +"/aaa/,/cdn/p" -scq! file 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.