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