Suchen und Ersetzen (per sed mit regex?)
Suchen und Ersetzen (per sed mit regex?)
Hallo,
ich möchte ein txt.file manipulieren, habe sowas allerdings noch nie per scripting gemacht. Aus Zeilen mit dem Muster
'mozillaPostalAddress2:'97080 Wuerzburg'
sollen die zwei Zeilen
'mozillaHomePostalCode: 97080
mozillaHomeLocalityName: Wuerzburg'
werden.
In einem anderen Post habe ich bereits sed entdeckt:
sed -e test.txt s/sucheNach/ErsetzeDurch/g INPUTFILE > OUTPUTFILE
Mit dem Ausdruck 'mozillaPostalAddress2: ([0-9]{5}) ([A-Za-z]*)' sollte ich die obige Zeile erwischen (also das sucheNach). Wie kann ich jetzt auf die durch die runden Klammern definierten Gruppen zugreifen um PLZ und Ort in die neue Zeile zu schreiben?
Oder würdet ihr das mit ganz anderen Tools lösen?
smo
ich möchte ein txt.file manipulieren, habe sowas allerdings noch nie per scripting gemacht. Aus Zeilen mit dem Muster
'mozillaPostalAddress2:'97080 Wuerzburg'
sollen die zwei Zeilen
'mozillaHomePostalCode: 97080
mozillaHomeLocalityName: Wuerzburg'
werden.
In einem anderen Post habe ich bereits sed entdeckt:
sed -e test.txt s/sucheNach/ErsetzeDurch/g INPUTFILE > OUTPUTFILE
Mit dem Ausdruck 'mozillaPostalAddress2: ([0-9]{5}) ([A-Za-z]*)' sollte ich die obige Zeile erwischen (also das sucheNach). Wie kann ich jetzt auf die durch die runden Klammern definierten Gruppen zugreifen um PLZ und Ort in die neue Zeile zu schreiben?
Oder würdet ihr das mit ganz anderen Tools lösen?
smo
Re: Suchen und Ersetzen (per sed mit regex?)
du kannst die ausdruecke in runden klammern in ErsetzeDurch \1 ersetzen.smo hat geschrieben:
In einem anderen Post habe ich bereits sed entdeckt:
sed -e test.txt s/sucheNach/ErsetzeDurch/g INPUTFILE > OUTPUTFILE
Mit dem Ausdruck 'mozillaPostalAddress2: ([0-9]{5}) ([A-Za-z]*)' sollte ich die obige Zeile erwischen (also das sucheNach). Wie kann ich jetzt auf die durch die runden Klammern definierten Gruppen zugreifen um PLZ und Ort in die neue Zeile zu schreiben?
smo
die naechsten klammern mit \2, usw.
gruss
zaarkov
Hallo smo,
also mit "awk" ist es auch möglich.
...meine Lösung ist bestimmt nicht elegant, ich hoffe auf elegantere Lösungen
Ich bin mir nicht so sicher welche Anführungszeichen in der Datei sind und welche nicht, mit den [ code ]-Tags lässt sich soetwas deutlicher darstellen.
Hilft Dir das weiter?
http://www.linuxfibel.de/kapitel7.htm
Gruß fuzzy
also mit "awk" ist es auch möglich.
...meine Lösung ist bestimmt nicht elegant, ich hoffe auf elegantere Lösungen
Ich bin mir nicht so sicher welche Anführungszeichen in der Datei sind und welche nicht, mit den [ code ]-Tags lässt sich soetwas deutlicher darstellen.
Code: Alles auswählen
fuzzy@sid:/tmp$ cat test.txt
mozillaPostalAddress2:'97080 Wuerzburg
fuzzy@sid:/tmp$ sed "s/'/ /" test.txt | awk ' {print "mozillaHomePostalCode:"$2 "\nmozillaHomeLocalityName:"$3}'
mozillaHomePostalCode:97080
mozillaHomeLocalityName:Wuerzburg
http://www.linuxfibel.de/kapitel7.htm
Gruß fuzzy
Leider tut's noch nicht so wie ich will. Nochmal zur Klarstellung (da oben vom mir falsch angegeben), die Quelldatei (test.ldif) beinhaltet diese Zeile:
Daraus soll werden (test2.ldif):
Das habe ich bisher:
Raus kommt:
Er stört sich also anscheinend an der geöffneten Klammer im regulären Ausdruck? Ich denke ich mache beim Verwenden der Variablen was falsch. Nur was?
smo
Code: Alles auswählen
mozillaPostalAddress2: 97080 Wuerzburg
Code: Alles auswählen
mozillaHomePostalCode: 97080
mozillaHomeLocalityName: Wuerzburg
Das habe ich bisher:
Code: Alles auswählen
# /bin/bash
sucheNach='mozillaPostalAddress2: ([0-9]{5}) ([A-Za-z]*)'
plz='mozillaHomePostalCode: '
ort='mozillaHomeLocalityName: '
ersetzeDurch=$plz'\1\n'$ort'\2'
echo
echo $sucheNach
echo $plz
echo $ort
echo $ersetzeDurch
echo
sed s/$sucheNach/$ersetzeDurch/g test.ldif > test2.ldif
Code: Alles auswählen
mozillaPostalAddress2: ([0-9]{5}) ([A-Za-z]*)
mozillaHomePostalCode:
mozillaHomeLocalityName:
mozillaHomePostalCode: \1\nmozillaHomeLocalityName: \2
sed: -e Ausdruck #1, Zeichen 24: unterminated `s' command
smo
Zuletzt geändert von smo am 05.02.2006 19:52:09, insgesamt 1-mal geändert.
Code: Alles auswählen
fuzzy@sid:/tmp$ ll *ldif
-rw-r--r-- 1 fuzzy fuzzy 40 2006-02-05 18:35 test.ldif
fuzzy@sid:/tmp$ cat test.ldif
mozillaPostalAddress2: 97080 Wuerzburg
fuzzy@sid:/tmp$ /tmp/postcode.sh
fuzzy@sid:/tmp$ ll *ldif
-rw-r--r-- 1 fuzzy fuzzy 64 2006-02-05 18:45 test2.ldif
-rw-r--r-- 1 fuzzy fuzzy 40 2006-02-05 18:35 test.ldif
fuzzy@sid:/tmp$ cat test2.ldif
mozillaHomePostalCode: 97080
mozillaHomeLocalityName: Wuerzburg
fuzzy@sid:/tmp$ cat /tmp/postcode.sh
#!/bin/sh
VORHER="/tmp/test.ldif"
NACHHER="/tmp/test2.ldif"
/usr/bin/awk '{print "mozillaHomePostalCode: "$2 "\nmozillaHomeLocalityName: "$3}' $VORHER > $NACHHER
Es wird aber immer empfohlen den absoluten pfad anzugeben, also "/bin/echo" statt "echo" und so weiter...
smo hat geschrieben:Leider tut's noch nicht so wie ich will. Nochmal zur Klarstellung (da oben vom mir falsch angegeben), die Quelldatei (test.ldif) beinhaltet diese Zeile:Daraus soll werden (test2.ldif):Code: Alles auswählen
mozillaPostalAddress2: 97080 Wuerzburg
Code: Alles auswählen
mozillaHomePostalCode: 97080 mozillaHomeLocalityName: Wuerzburg
Das habe ich bisher:
[...]
Er stört sich also anscheinend an der geöffneten Klammer im regulären Ausdruck? Ich denke ich mache beim Verwenden der Variablen was falsch. Nur was?
smo
Code: Alles auswählen
#! /bin/bash
sucheNach='mozillaPostalAddress2: \([0-9]\{5\}\) \([A-Za-z]*\)'
plz='mozillaHomePostalCode: '
ort='mozillaHomeLocalityName: '
ersetzeDurch=$plz'\1\n'$ort'\2'
echo
echo "suche : $sucheNach"
echo "plz : $plz"
echo "ort : $ort"
echo "ersetze: $ersetzeDurch" # hier sinnlos, da \1, \2 und \n nicht
echo # definiert (für \n: echo -e)
sed -ne "s/$sucheNach/$ersetzeDurch/p" test.ldif | tee test2.ldif
Ulf
Sorry für die lange Reaktionszeit, aber die letzten Tage waren recht stressig.. ulfs Beispiel hat mir inzwischen den Durchbruch gebracht.
Letztendlich sieht's jetzt so aus:
Unterschiede zu ulfs Variante:
1. SucheNach: 'mozillaHomePostalAddress2' statt 'mozillaPostalAddress2' (mein Fehler)
2. sed: n-Option weggelassen weil ich auch die unveränderten Zeilen in test2.ldif schreiben will
3. sed: g für global -> alle passenden Textteile ersetzen
4. sed: Verzicht auf p -> Inhalt wird komplett ausgegeben
Danke an alle!
smo
Letztendlich sieht's jetzt so aus:
Code: Alles auswählen
#! /bin/bash
sucheNach='mozillaHomePostalAddress2: \([0-9]\{5\}\) \([A-Za-z]*\)'
plz='mozillaHomePostalCode: '
ort='mozillaHomeLocalityName: '
ersetzeDurch=$plz'\1\n'$ort'\2'
echo
echo "suche : $sucheNach"
echo "plz : $plz"
echo "ort : $ort"
echo "ersetze: $ersetzeDurch"
echo
sed -e "s/$sucheNach/$ersetzeDurch/g" my.ldif | tee myNew.ldif
1. SucheNach: 'mozillaHomePostalAddress2' statt 'mozillaPostalAddress2' (mein Fehler)
2. sed: n-Option weggelassen weil ich auch die unveränderten Zeilen in test2.ldif schreiben will
3. sed: g für global -> alle passenden Textteile ersetzen
4. sed: Verzicht auf p -> Inhalt wird komplett ausgegeben
Danke an alle!
smo