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
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
Am Mi 31.08.2005 10:54 schrieb K. Elo <maillists@nic.fi>: Hallo,
Mein Beitrag:
sed '{ s/^.*(@@.*@@).*//;s/[@@| ]//g;s/^+/00/;s/[^0-9]//g }'
ich habe in der zwischenzeit viel herum probiert und habe das ganze nochmal überarbeitet. Ich benutze jetzt die Zeichenfolge @# um den Anfang zu markieren und #@ für das Ende. Mit: echo "bla bla @# +49 621 / 4829-399 #@ bla bla" |sed -e 's/^.*\@#//' -e 's/\#@.*$//' -e 's/ //g' -e 's/^+49/0/' -e 's/^+/00/' -e 's/\///g' -e 's/-//g' funktioniert das in allen, von mir probierten, Variationen. Ob das effizient ist kann ich nicht sagen. Zumindest funktioniert es. Viele Grüße Sven
Hallo nochmals, Sven Gehr schrieb:
Am Mi 31.08.2005 10:54 schrieb K. Elo <maillists@nic.fi>:
Hallo,
Mein Beitrag:
sed '{ s/^.*(@@.*@@).*//;s/[@@| ]//g;s/^+/00/;s/[^0-9]//g }'
ich habe in der zwischenzeit viel herum probiert und habe das ganze nochmal überarbeitet. Ich benutze jetzt die Zeichenfolge @# um den Anfang zu markieren und #@ für das Ende. Mit:
echo "bla bla @# +49 621 / 4829-399 #@ bla bla" |sed -e 's/^.*\@#//' -e 's/\#@.*$//' -e 's/ //g' -e 's/^+49/0/' -e 's/^+/00/' -e 's/\///g' -e 's/-//g'
funktioniert das in allen, von mir probierten, Variationen. Ob das effizient ist kann ich nicht sagen. Zumindest funktioniert es.
Ist ja prima, wenn's funktioniert. Dasselbe erreichst Du aber auch mit: sed '{ s/^.*\(@#.*#@\).*/\1/;s/[@#|#@| ]//g;s/^+/00/;s/[^0-9]//g }' Hier wird zuerst (s/^.*...) die ganze Zeile durch die Kette von '@#' bis (inkl.) '#@' ersetzt, dann (;s/[@...) alle '@#', '#@' und Leerzeichen entfernt, danach (;/s^+...) das erste '+' durch '00' ersetzt und schließlich (;s/[^0...) alle Nicht-Zahlen entfernt. M.E. wird Dein Befehl nicht richtig funktionieren, falls die Telefonnummer (?) nicht mit +49 (sondern z.B. mit +358 :) ) beginnt... Gruß Kimmo
Hallo, Am Wed, 31 Aug 2005, Sven Gehr schrieb:
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:
@@+ @@ +
s/^@@ *+/00/;
2.) Nachdem ein evtl. vorhandenes + Zeichen am Anfang umgesetzt ist sollen alle Zeichen die keine Zahl sind (Leerzeichen, /, - etc.) entfernt werden.
s/[^0-9]//g;
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' ^^ ^ du hast das mit den '+' genau fsalchrum. Und die Klammern fuer die Backreferences muessen escaped werden. Ebenso die '?'. Les bitte mal 'man 7 regex' bzgl. "Basic Regular Expressions", denn diese verwendet sed.
sed 's/^@@ *+/00/;s/[^0-9]\+//g;' $ echo '@@+49621/4829-399@@ @@+49621/4829 399@@ @@+49621 4829/399@@' | sed 's/@@ *+/00/;s/[^0-9]\+//g;' 00496214829399 00496214829399 00496214829399 Falls du als Mustererkennung (welche Zeile bearbeitet werden soll) die '@@' vorne und hinten brauchst, dann nimm eine Adresse zu Hilfe: $ echo 'bla @@+49621/4829-397@@ @@+49621/4829 398@@ fasel +49621-4829399@@' | sed -n '/^@@.*@@$/ { s/^@@ *+/00/; s/[^0-9]\+//g; p; }' 00496214829397 00496214829398 Hier werden also nur die Zeilen bearbeitet (und dann ausgegeben) die mit @@ beginnen _und_ enden. Du solltest aber (je nach dem was du fuer Eingabedaten hast) die Mustererkennung noch restriktiver machen, z.B. statt dem einfachen Test auf /^@@.*@@$/ die erlaubten Zeichen zwischen den '@@' noch eingrenzen, z.B.: /^@@[0-9 \/()+-]\+@@$/ ^^backslash escaped, und in der Adresse kann man nicht andere Zeichen als // verwenden. Das erlaubt zwischen den @@ am Zeilenanfang und -ende nur Zahlen, Leerzeichen (kein Tab!), sowie '/', '(', ')', '+' und '-'. Der - muss entweder als erstes (nicht sinnvoll) oder als letztes Zeichen stehen, da er sonst innerhalb der [] die eine Zeichenklasse definiert einen Bereich kennzeichnet (wie eben z.B. [0-9]). Ausserdem muss mindestens eines dieser Zeichen zwischen den '@@' vorkommen ('\+').
Diese Syntax enthält jedoch noch Fehler und ich bekomm's einfach nicht hin.
RTFM (auch man sed) wegen der grundlegenden Syntaxfehler, die du gemacht hast! (s.o.) -dnh --
Brauchst bloß ein paar Millionen richtig anzulegen, schon bist Du Rentier Das ist es ja eben. Angelegt hab' ich - das letzte mal mit 'nem Paddelboot am Steg - schon sooo viel. Bin jetzt ja auch schon bei meiner 3. Millionen (weil die ersten beiden nichts geworden sind). -- >B. Brodeßer, V. Müller
participants (3)
-
David Haller
-
K. Elo
-
Sven Gehr