Hallo, Sven Gehr schrieb:
Hallo zusammen,
ich habe ein Problem mit sed. Die Problemstellung ist wie folgt:
In einem Textfile stehen an einer nicht exakt definierten Position ein String der mit @@ beginnt und mit @@ endet. Der Teil der zwischen diesen @@'s steht soll extrahiert werden und unformatiert werden. Beim umfarmatieren sollen folgende Regeln angewendet werden:
1.) Ein führendes + Zeichen soll durch 00 ersetzt werden. Das soll lediglich mit einem + Zeichen passieren das ganz am Anfang steht. Tauch dieses Zeichen innerhalb des Strings nocheinmal auf wird es wie ein Sonderzeichen behandelt und entfernt (siehe unten). Zu beachten ist. Das zwichem dem + und den @@-Zeichen die den Anfang markieren durchaus ein Leerzeichen stehen kann. Die Zeichenkette kann also wie folgt beginnen:
@@+ @@ +
2.) Nachdem ein evtl. vorhandenes + Zeichen am Anfang umgesetzt ist sollen alle Zeichen die keine Zahl sind (Leerzeichen, /, - etc.) entfernt werden.
Ich bin nicht unbedingt der sed-Profi. Was ich bisher hinbekommen habe ist:
sed -r 's/@@\s*?\+([0-9]+)\s*?([0-9]+)[^0-9]*?([0-9]+)\/?([0-9]+)?@@/00\1\2\ 3\4/g'
Diese Syntax enthält jedoch noch Fehler und ich bekomm's einfach nicht hin. Das mit @@ gekennzeichnete Ende wird nicht erkannt:
Mache ich ein:
echo @@+49621 4829/399@@bla bla bla|sed ..... erhalte ich:
00496214829399bla bla bla
Selbst wenn ich hinter der 2. @@-Kette keine Zeichen mehr übergebe ibt es Varianten die nicht funktionieren:
@@+49621/4829-399@@ -> @@+49621/4829-399@@ @@+49621/4829 399@@ -> @@+49621/4829 399@@
Kenn sich jemand mit sed aus und kann mir sagen wo mein Fehler ist?
Viele Grüße Sven
Mein Beitrag: sed '{ s/^.*\(@@.*@@\).*/\1/;s/[@@| ]//g;s/^+/00/;s/[^0-9]//g }' Gruß Kimmo