Hallo zusammen, ich möchte aus vielen Dateien bestimmte Zeilen filtern. zB.: `grep -e 'Stelle1' -e 'Stelle2' -e 'Stelle3' *.ext` Allerdings brauche ich von 'Stelle2' auch die nachfolgende Zeile. Mit -A1 bekomme ich jedoch von _allen_ Fundstellen die nachfolgende Zeile mit. Wie könnte ich das vernünftig lösen? MfG Th. Moritz -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Sat, 01 Mar 2014, Thomas Moritz schrieb:
ich möchte aus vielen Dateien bestimmte Zeilen filtern.
zB.: `grep -e 'Stelle1' -e 'Stelle2' -e 'Stelle3' *.ext`
Allerdings brauche ich von 'Stelle2' auch die nachfolgende Zeile. Mit -A1 bekomme ich jedoch von _allen_ Fundstellen die nachfolgende Zeile mit. Wie könnte ich das vernünftig lösen?
Vergiss grep. for f in *.ext; do sed -n \ -e '/Stelle1/p; /Stelle2/ { p; n; p; } /Stelle3/p; ' "$f" done --
Open .profile with vi The vi looks at the .profile and says, "icky, I'm not opening that. Ask Emacs." -- Graham Reed, feeling adventuroush. -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo David, besten Dank für Deine schnelle und geniale Antwort! Am 01.03.2014 um 19:09 schrieb David Haller <dnh@opensuse.org>:
ich möchte aus vielen Dateien bestimmte Zeilen filtern.
zB.: `grep -e 'Stelle1' -e 'Stelle2' -e 'Stelle3' *.ext`
Allerdings brauche ich von 'Stelle2' auch die nachfolgende Zeile. Mit -A1 bekomme ich jedoch von _allen_ Fundstellen die nachfolgende Zeile mit. Wie könnte ich das vernünftig lösen?
Vergiss grep.
for f in *.ext; do sed -n \ -e '/Stelle1/p; /Stelle2/ { p; n; p; } /Stelle3/p; ' "$f“ done
Prima: "opensuse 13.1 x86_64“ (sed 4.2.2) alles OK! In OSX (Mavericks) geht das nicht ohne: LC_CTYPE=C && LANG=C && (script oder cl) sonst kommt: "sed: RE error: illegal byte sequence Mit einem „i“ kann ich gleich noch eine Leerzeile einfügen: /Stelle2/ { p; n; p; i } /Stelle3/p; Nun ist alles OK und sieht auch noch gut aus! Besten Dank! MfG Th. Moritz -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Sat, 01 Mar 2014, Thomas Moritz schrieb:
Prima: "opensuse 13.1 x86_64" (sed 4.2.2) alles OK!
In OSX (Mavericks) geht das nicht ohne:
LC_CTYPE=C && LANG=C && (script oder cl)
sonst kommt: "sed: RE error: illegal byte sequence
Das dürfte ein Konflikt zwischen der Kodierung deines Musters und dem des Terminals bzw. dem was sed erwartet sein. BTW: mit LANG=C LC_CTYPE=C script/cl bzw. LC_ALL=C script/cl wird deine Umgebung nicht verändert. Alternativ kannst du auch ne Subshell verwenden (ein "Block" {} reicht hier nicht[1]): ( LANG=C; LC_CTYPE=C; script/cl ; ) Ob das alles auch unter OS X so ist mußt du testen.
Mit einem ,,i" kann ich gleich noch eine Leerzeile einfügen: [..] Nun ist alles OK und sieht auch noch gut aus! Besten Dank!
*g* Ich pack da mal wieder eine meiner Faustregeln aus: "wenn du mehr als eins von grep, sed, awk, perl/python/ruby usw. in einer Commandline hast, schreib gleich alles im hier jew. später genannten. Ausnahmen gibt's[2], wenn auch eher selten." -dnh [1] es sei denn du zwingst den Block in ne Subshell, z.B. durch ne anschließende Pipe ;) { LANG=C; script; } | cat [2] ==== perldoc perlvar ==== $RS $/ The input record separator, newline by default. [..] Remember: the value of $/ is a string, not a regex. awk has to be better for something. :-) ==== (und klar, kann man bei perl emulieren, mindestens solange das File ins RAM passt (File "slurpen", per split an RE auftrennen). -- Well I wish you'd just tell me rather than try to engage my enthusiasm. -- Marvin -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo David,
"sed: RE error: illegal byte sequence
Das dürfte ein Konflikt zwischen der Kodierung deines Musters und dem des Terminals bzw. dem was sed erwartet sein.
BTW: mit
LANG=C LC_CTYPE=C script/cl bzw. LC_ALL=C script/cl
wird deine Umgebung nicht verändert. Alternativ kannst du auch ne Subshell verwenden (ein "Block" {} reicht hier nicht[1]):
( LANG=C; LC_CTYPE=C; script/cl ; )
Ob das alles auch unter OS X so ist mußt du testen.
echo -e "LC_CTYPE=$LC_CTYPE\nLANG=$LANG“; \ LC_CTYPE=C && LANG=C && echo -e „--\nLC_CTYPE=$LC_CTYPE\nLANG=$LANG“ LC_CTYPE= LANG=de_DE.UTF-8 -- LC_CTYPE=C LANG=C Achja, eine Zeile in OSX-sed hinzufügen (hier reicht das i nicht!): ... p; i\ —————— }
Ich pack da mal wieder eine meiner Faustregeln aus: "wenn du mehr als eins von grep, sed, awk, perl/python/ruby usw. in einer Commandline hast, schreib gleich alles im hier jew. später genannten. Ausnahmen gibt's[2], wenn auch eher selten.“
Hau ruhig wieder einen drauf :-) Ich werde mit perl nicht so richtig warm. Vermutlich, weil ich immer seltener scripten muss. Ich wünsche einen schönen Sonntag. Besten Dank! MfG Th. Moritz -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (2)
-
David Haller
-
Thomas Moritz