sed - Bitte um Unterstützung

W

WesMPipes

Grünschnabel
Hallo zusammen,

ich habe ein Problem mit dem Verstehen der sed-syntax.
Beim googeln nach meinem Problem bzw. um sed zu verstehen, bin ich vorwiegend auf englische Beiträge gestoßen und das hat mich noch mehr verwirrt.

Ich bräuchte bitte Unterstützung in folgender Problemstellung:
Ich habe in einer log-Datei Zeilen mit diesem Aufbau
yyyy-mm-dd hh:mm:ss URL: ServerURL/Pfad/wo/ich/eine/Datei/lade/Datei.endung [12345/12345] -> "Pfad/wo/die/Datei/lokal/gespeichert/wird/Datei.endung" [1]

Mit einem ersten sed-Befehl (von einem Kollegen übernommen)
Bash:
sed -r 's/([^\.]*)\-> .*/\1/'
bekomme ich die Zeilen fast wie gewünscht hin:

yyyy-mm-dd hh:mm:ss URL: ServerURL/Pfad/wo/ich/eine/Datei/lade/Datei.endung [12345/12345]

Nun möchte ich den letzten Part in den Eck-Klammern auch noch weg haben, so dass nur noch Datum/ServerUrl/Download-Pfad/Datei da steht.

Also:

yyyy-mm-dd hh:mm:ss URL: ServerURL/Pfad/wo/ich/eine/Datei/lade/Datei.endung

Wie muss ich den sed-Befehl erweitern um auch noch diesen Eck-Klammer-Teil weg zu bekommen?
Ich habe leider echt keinen Schimmer und wäre über Hilfe dankbar

Grüße Wes
 
Hallo zusammen,

nach Optimierung meiner Google-Suche habe ich es hinbekommen (verstehen tu` ich das sed-Zeug immer noch nicht)

Ich habe jetzt die Ausgabe meines ersten sed-Befehls gepiped und nochmal durch ein anderes sed-Konstrukt geschickt.
Meine Zeile sieht jetzt so aus:

Bash:
`cat $LOG_CLEAN | sed -r 's/([^\.]*)\-> .*/\1/' | sed 's/\[\([^]]*\)\]/\ /g' > $LOG_FILE`

Das Ergebnis ist (fast) wie gewünscht, nur dass ich im Log nach der Dateiendung noch ein Leerzeichen habe - was man aber in dem Log nicht sieht. Da das endgültige Log nicht weiter verarbeitet wird bin ich mit dem Ergebnis zufrieden.

Wenn noch jemand einen effektiveren/besseren Ansatz hat, nehme ich den gerne an ^^

Grüße
Wes
 
Versuch es mal hiermit:
Bash:
cat $LOG_CLEAN | sed -r 's/ \[.*//' > $LOG_FILE
 
Versuch es mal hiermit:
Bash:
cat $LOG_CLEAN | sed -r 's/ \[.*//' > $LOG_FILE
Hi mitch,

jupp - das ist eindeutig effektiver und "hübscher" und auch im Log sind nach der Dateiendung die Leerzeichen weg - vielen Dank!
Wobei nun verschließt sich mir das Verständnis von sed komplett :brav:

Nichts desto Trotz - das sed von Dir macht was es soll und den Rest (Verständnis) werde ich mir noch aneignen müssen.


Grüße
Wes
 
Der Befehl ist ein einfaches Suchen und Ersetzen. Was etwas verwirrend sein kann, ist der Einsatz eines regulären Ausdrucks, der hier für die Suche verwendet wird.

Die einfache Syntax ist hier:

s/SUCHE/ERSETZE/

SUCHE ist hierbei der reguläre Ausdruck \[.* nach dem wir suchen, also ein Leerzeichen gefolgt von einer öffnenden (eckigen) Klammer. Danach folgt ein beliebiges Zeichen . beliebig oft *. Der Backslash vor der Klammer dient hier nur zum Escapen, da die Klammer auch eine besondere Bedeutung bei regulären Ausdrücken hat. Hier wollen wir aber explizit die Klammer als Zeichen suchen.

ERSETZE wird hier quasi durch eine leere Zeichenkette ersetzt, weswegen zwischen den syntaktischen Zeichen / des sed-Befehls nichts steht.

Bei deinem Beispiel
yyyy-mm-dd hh:mm:ss URL: ServerURL/Pfad/wo/ich/eine/Datei/lade/Datei.endung [12345/12345] -> "Pfad/wo/die/Datei/lokal/gespeichert/wird/Datei.endung" [1]

wird also der rot markierte Teil durch den regulären Ausdruck gefunden und durch nichts ersetzt bzw. eben gelöscht.

Wobei nun verschließt sich mir das Verständnis von sed komplett :brav:
sed ist denke ich hier das kleinste Problem, es empfiehlt sich auch mal ein genaueren Blick auf die Verwendung von regulären Ausdrücken zu werfen 😉

Ich hoffe ich konnte dir wenigstens ein bisschen Verständnis wieder verschaffen...
 
Hi mitch - Du hast Recht - das größere Problem des Verständnisses liegt bei den Regulären Ausdrücken ^^
Aber ich verstehe jetzt, was Dein sed-Befehl jetzt zu bedeuten hat und wie es Zustande kommt, dass dieser kurze Ausdruck genau das vollzieht was er soll. Ich danke Dir sehr für die Super Erläuterung!

@marce : Wäre es in meinem Fall nicht ein useless-use-of-pipe-award? :D
 

Ähnliche Themen

Textdatei filtern und löschen mit grep /sed

SED: Zu bearbeitende Dateien aus Textfile einlesen

sed mit basename verknüpfen - oder anders Dateipfade in Dateien mit regex ersetzen?

Mehrzeiligen String mittels sed ersetzen

awk: Dateiinhalt/Variableninhalt als Teil einer if-Anweisung

Zurück
Oben