sed Regex

Hallo,

suche schon die längste Weile ohne Erfolg.
Ich habe diese Zeile:
telephoneNumber: +39 0474-551 999

telephoneNumber: und eine Leerstelle am Zeilenanfang sollen bleiben alle
anderen Zeichen, die in der Telefonnummer enthalten sind, sollen
verschwinden, egal was es ist (Leerstellen, Bindestriche, alles was
keine Ziffer ist).
Wie mache ich das mit sed?

Gruß
Luigi

Hallo,

Luigi di Lazzaro wrote:

telephoneNumber: +39 0474-551 999

telephoneNumber: und eine Leerstelle am Zeilenanfang sollen bleiben alle
anderen Zeichen, die in der Telefonnummer enthalten sind, sollen
verschwinden, egal was es ist (Leerstellen, Bindestriche, alles was
keine Ziffer ist).
Wie mache ich das mit sed?

Hmm, da gibt es meherere Loesungen. Ich nehme an, dein File ist ein LDIF
File, und deshalb einigermassen streng formatiert.

1) "In jeder Zeile, die mit telephoneNumber beginnt, loesche alles nach
dem ersten Doppelpunkt; behalte nur den Doppelpunkt selber":

sed -e '/^telephoneNumber:/s/:.*/:/'

2) "substituiere 'telephoneNumber:' und alles was danach kommt mit
'telephoneNumber'":

sed -e 's/telephoneNumber: .*/telephoneNumber:/'

3) Wie 2) aber mit einem Trick: (back-reference): in sed kannst du
sub-expressions in Klammern setzen \( und \) und alles was in der Klammer
enthalten ist, spaeter mit \1 referenzieren:

sed -e 's/\(telephoneNumber:\) .*/\1/'

HTH
Thomas

PS (Eigenwerbung): Vielleicht interessiert dich meine kleine Einfuehrung
in sed:
http://www.tty1.net/sed-tutorium_de.html

Hallo,

suche schon die längste Weile ohne Erfolg.
Ich habe diese Zeile:
telephoneNumber: +39 0474-551 999

telephoneNumber: und eine Leerstelle am Zeilenanfang sollen bleiben alle
anderen Zeichen, die in der Telefonnummer enthalten sind, sollen
verschwinden, egal was es ist (Leerstellen, Bindestriche, alles was
keine Ziffer ist).
Wie mache ich das mit sed?

Può essere awk?

$echo "telephoneNumber: +39 0474-551 999" | \
awk -F: '{ gsub(/[\+ -]/,""); print $1": "$2 }'

telephoneNumber: 390474551999

Gruß
Luigi

Ciao,
DAniele

Zunächst einmal danke für die Antworten,

@Beniamin
Dein Einzeiler lässt mir nur den Zeilenanfang zurück.
Ich brauche den Zeilenanfang bis zum Doppelpunkt und danach noch eine
Leerstelle.

[sed regexp]

> telephoneNumber: +39 0474-551 999
>
> telephoneNumber: und eine Leerstelle am Zeilenanfang sollen bleiben
> alle anderen Zeichen, die in der Telefonnummer enthalten sind,
> sollen verschwinden, egal was es ist (Leerstellen, Bindestriche,
> alles was keine Ziffer ist).
> Wie mache ich das mit sed?

Hmm, da gibt es meherere Loesungen. Ich nehme an, dein File ist ein
LDIF File, und deshalb einigermassen streng formatiert.

Ja, du vermutest richtig.

1) "In jeder Zeile, die mit telephoneNumber beginnt, loesche alles
nach dem ersten Doppelpunkt; behalte nur den Doppelpunkt selber":

sed -e '/^telephoneNumber:/s/:.*/:/'

2) "substituiere 'telephoneNumber:' und alles was danach kommt mit
'telephoneNumber'":

sed -e 's/telephoneNumber: .*/telephoneNumber:/'

3) Wie 2) aber mit einem Trick: (back-reference): in sed kannst du
sub-expressions in Klammern setzen \( und \) und alles was in der
Klammer enthalten ist, spaeter mit \1 referenzieren:
sed -e 's/\(telephoneNumber:\) .*/\1/'

Daran hatte ich bereits gedacht. Leider kommen die Leerstellen ganz
unterschiedlich und, wenn ich es richtig verstanden habe, werden gerade
diese als Unterbrechung interpretiert.

http://www.tty1.net/sed-tutorium_de.html

Kann es nur weiter empfehlen, da ist viel drinnen.
Ich probiere weiter. Angenommen ich komme zum Ziel melde ich es hier.
Gruß

Ciao Daniele,

> suche schon die längste Weile ohne Erfolg.
> Ich habe diese Zeile:
> telephoneNumber: +39 0474-551 999
>
> telephoneNumber: und eine Leerstelle am Zeilenanfang sollen bleiben
> alle anderen Zeichen, die in der Telefonnummer enthalten sind,
> sollen verschwinden, egal was es ist (Leerstellen, Bindestriche,
> alles was keine Ziffer ist).
> Wie mache ich das mit sed?

Può essere awk?

$echo "telephoneNumber: +39 0474-551 999" | \
awk -F: '{ gsub(/[\+ -]/,""); print $1": "$2 }'

telephoneNumber: 390474551999

Perchè no? Non credo di venirne a capo con sed.
Faccio comunque ancora alcuni tentativi
Grazie
Luigi

Thomas Pircher wrote:

Luigi di Lazzaro wrote:

telephoneNumber: +39 0474-551 999

telephoneNumber: und eine Leerstelle am Zeilenanfang sollen bleiben alle
anderen Zeichen, die in der Telefonnummer enthalten sind, sollen
verschwinden, egal was es ist (Leerstellen, Bindestriche, alles was
keine Ziffer ist).
Wie mache ich das mit sed?

Upps, ich hatte das nicht richtig verstanden... Ich habe alles nach
TelephoneNumber; geloescht.

Neuer Versuch:

sed -e '/^ telephoneNumber: /{s/[^0-9]//g; s/^/ telephoneNumber: /;}'

Erklaerung: In allen Zeilen die mit " TelephoneNumber: " beginnen tue
folgendes:
1) loesche alles, was keine Ziffer ([^0-9] ist)
2) ersetze den Zeilenanfang mit " TelephoneNumber: "

Test:
Ein: telephoneNumber: +39 0474-551 999
Aus: telephoneNumber: 390474551999

habe ich es nun richtig verstanden? :slight_smile:

Thomas

Hallo nochmals,

Upps, ich hatte das nicht richtig verstanden... Ich habe alles nach
TelephoneNumber; geloescht.

Neuer Versuch:

sed -e '/^ telephoneNumber: /{s/[^0-9]//g; s/^/ telephoneNumber: /;}'

Erklaerung: In allen Zeilen die mit " TelephoneNumber: " beginnen
tue folgendes:
1) loesche alles, was keine Ziffer ([^0-9] ist)
2) ersetze den Zeilenanfang mit " TelephoneNumber: "

Test:
Ein: telephoneNumber: +39 0474-551 999
Aus: telephoneNumber: 390474551999

Ja, aber es funktioniert nicht :frowning:
sed -e '/^ telephoneNumber: /{s/[^0-9]//g; s/^/ telephoneNumber: /;}'
$WORKPATH/ldap.sed > $WORKPATH/tfbuch.ldif

Mache ich etwas falsch?
Luigi

Habe den Fehler gefunden:

> sed -e '/^ telephoneNumber: /{s/[^0-9]//g; s/^/ telephoneNumber:

                      ^

> /;}'

da ist eine Leerstelle.
Ok, danke an alle.
Gruß e un ciao a Daniele
Luigi

Luigi di Lazzaro wrote:

Habe den Fehler gefunden:

> sed -e '/^ telephoneNumber: /{s/[^0-9]//g; s/^/ telephoneNumber:

da ist eine Leerstelle.

Sorry! war (bin) heute ein wenig verwirrt.

Merke: schreib niemals (sed) Programme wenn du am Abend zuvor eine
Katholikenverbrennung[1] gebuehrend gefeiert hast! :slight_smile:

Thomas

[1] http://en.wikipedia.org/wiki/Guy_Fawkes_Night

Hallo Thomas, hallo *,

[sed Befehlsfolge]
sed -e '/^telephoneNumber: /{s/[^0-9]//g; s/^/ telephoneNumber: /;}'
Ich wusste gar nicht, dass man auf eine Zeile eine Befehlsfolge anwenden
kann. Ich vermute, dass die geschweiften Klammer für diesen Zweck sind.
So ein Beispiel in deinem Howto wäre sicher nützlich oder habe ich es
übersehen?
Jedenfalls geht das sehr gut.

Merke: schreib niemals (sed) Programme wenn du am Abend zuvor eine
Katholikenverbrennung[1] gebuehrend gefeiert hast! :slight_smile:

Da hast du ja Glück gehabt, dass du mit einer einzigen Leerstelle davon
gekommen bist ...
Gruß und danke an alle für die Antworten
Luigi