sed und best. Zeilen nicht ausgeben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

sed und best. Zeilen nicht ausgeben

Beitrag von Duff » 26.02.2008 08:25:07

Hallo,

und mal wieder eine Frage zu sed. Ich habe in einer Ausgabe mehrere sed-Befehle mit -e angebeben. Die Ausgabe sieht soweit auch ganz gut, nur dass zu viele "Sachen" ausgegeben werden.

Von dieser Ausgabe möchte ich alles nicht ausgeben, in den das Wort "queue" vorkommt. Ok, könnte es mit grep -v realisieren, aber wenn ich schon einmal mit sed dran bin, hätte ich es auch gerne damit realisiert.

Habe mir dazu den Link [1] angeschaut. Aber irgendwie verstehe ich es wohl nicht richt.

Dachte, dass es so funktionieren sollte (was aber nicht funktioniert):

Code: Alles auswählen

... | sed -e ... -e ... -e '/queue/!'
[1]http://www.tty1.net/sed-tutorium/html/ar01s09.html
Oh, yeah!

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 26.02.2008 09:57:26

-e '/queue/d'
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.02.2008 10:33:54

Ok, stimmt. So geht es auch. Einfach die Zeilen löschen.

Aber laut Anleitung des Links oben, sollte es doch auch irgendwie mit dem !-Zeichen funktionieren.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 26.02.2008 11:09:39

mit '!' gehts natürlich auch

Code: Alles auswählen

gms2 ~ # echo -e "bla\nqueue\nquak" | sed -e '/queue/d'
bla
quak
gms2 ~ # echo -e "bla\nqueue\nquak" | sed -ne '/queue/!p'
bla
quak
( in diesem Beispiel, sehe darin allerding keine Vorteile )

Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.02.2008 12:01:23

Ok, hatte wohl das -n zum Unterdrücken der normalen Ausgabe auf stdout vergessen.

Wie kann ich denn nochmal in einem substitude zuerst nach einem Pattern suchen und anschließend für die gefundenen Patterns die substitution ausführen?
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Beitrag von Meillo » 26.02.2008 12:16:47

Duff hat geschrieben:Wie kann ich denn nochmal in einem substitude zuerst nach einem Pattern suchen und anschließend für die gefundenen Patterns die substitution ausführen?

Code: Alles auswählen

sed '/search/ s/old/new'
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.02.2008 12:26:16

Ok, da musst man dann auch wieder den Schalter -n verwenden und am Ende der Ersetzung ein p für print.

Und wenn die Suche 2 Patterns entsprechen soll?
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 26.02.2008 12:34:28

Code: Alles auswählen

gms2 ~ # echo -e "bla\nqueue\nquak" | sed -ne '/q/!n;/k/ s/a/ic/p'
quick

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.02.2008 12:42:57

Wahnsinn....

Es werden nun hier alle Zeilen eingelesen, die kein q enthalten (/q/!) und danach werden alle Zeilen dem Suchpattern (n) angehangen (Treffer von /k/).

Wird hier wirklich nur bis zum ersten Treffer von q gesucht, also queue?
Wieso wird das bla nicht mehr mit ausgegeben?
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Beitrag von Meillo » 26.02.2008 13:27:45

Duff hat geschrieben:Und wenn die Suche 2 Patterns entsprechen soll?
Formuliere das Pattern so, dass es beide Fälle abdeckt (z.B. 'aa|bb')
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.02.2008 14:15:26

Sorry, aber bei mir funktioniert das so nicht.
Steht das |-Zeichen nicht normalerweise für ein ODER?
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Beitrag von Meillo » 26.02.2008 14:32:24

Duff hat geschrieben:Steht das |-Zeichen nicht normalerweise für ein ODER?
*kK* :oops:

:D
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.02.2008 16:11:02

Bitte was?
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Beitrag von Meillo » 26.02.2008 16:22:50

Duff hat geschrieben:Bitte was?
na, du hast natürlich recht. Mein Kommentar war nicht allzu sinnvoll. :roll:

Aber ich habe mir überlegt, dass du da vielleicht was schachteln könntest.
Hab's gerade ausprobiert, und es funktioniert :-)

Code: Alles auswählen

< pantheon | meillo | /tmp >
    $ cat text 
3 aa laber
3 bb laber
3 aa laber
4 aa laber
4 bb laber
4 cc laber

< pantheon | meillo | /tmp >
    $ cat text | sed '/3/ { /bb/s/laber/blubb/ }'
3 aa laber
3 bb blubb
3 aa laber
4 aa laber
4 bb laber
4 cc laber
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 27.02.2008 08:43:01

Mmh...danke.

Unter debian funktioniert es so bzw. wird kein Fehler gemeldet. Führe ich den Befehl allerdings unter HP-UX aus, bekomme ich immer die Fehlermeldung

Code: Alles auswählen

sed: Function ... cannot be parsed
Oh, yeah!

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Beitrag von Meillo » 27.02.2008 08:58:21

Duff hat geschrieben:Unter debian funktioniert es so bzw. wird kein Fehler gemeldet. Führe ich den Befehl allerdings unter HP-UX aus, bekomme ich immer die Fehlermeldung

Code: Alles auswählen

sed: Function ... cannot be parsed
liegt vermutlich daran, dass nur gsed weitere Adressen in geschweiften Klammern erlaubt. Bei den anderen seds werden da wohl nur Befehle erlaubt sein.
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 27.02.2008 09:03:49

Meillo hat geschrieben:
Duff hat geschrieben:Unter debian funktioniert es so bzw. wird kein Fehler gemeldet. Führe ich den Befehl allerdings unter HP-UX aus, bekomme ich immer die Fehlermeldung

Code: Alles auswählen

sed: Function ... cannot be parsed
liegt vermutlich daran, dass nur gsed weitere Adressen in geschweiften Klammern erlaubt. Bei den anderen seds werden da wohl nur Befehle erlaubt sein.
Stimmt, sowas steht auch in der manpage von sed unter HP-UX.

Code: Alles auswählen

{ cmd1
cmd2
cmd3
...
}
Naja, schade. Dann werde ich wohl doch mit einem zusätzlichem grep arbeiten müssen ;-)
Oh, yeah!

Antworten