• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

sed Zeichen an zwei Stellen hinzufügen

Hallo,

ich versuche gerade mit Sed ein Problem zu lösen komme aber mit Google nicht weiter. Vermutlich suche ich nicht richtig. Aber es ist auch schwierig die richtige Frage zu stellen.

Ich habe viele Textfiles, in diesen muss ich die erste Zeile finden die mit code135 anfängt.
Zeile sieht wie folgt aus:

Code:
code135( 22.5 , 167.34 , "left" , "1017892011" )
die Zehnstellig Zahl am Ende muss ich wie folgt formatieren:
Code:
1.01789.2011

Das aufrufen des Wortes klappt schon ganz gut
Code:
sed -e 's/\"..........\"/&./
Allerdings wird nun nur am Ende ein Punkt eingefügt und nicht an der entsprechenden Stelle. Ich hab auch schon ein /1 und /6 probiert aber das ist ungültig.

Allerdings kann ich nicht sicher sein, das in dem Textfile nur einmal eine Zehnstellige Nummer auftaucht. Daher muss ich ähnlich wie mit grep sicherstellen dass nur die erste Zeile die mit code135 anfängt genommen wird. Könnt ihr da am Befehl die nötige Änderung durchführen?

Das -e werde ich dann durch -i ersetzen, da ich die Änderungen auch in die Datei reinschreiben will.
 
Hi Emanuele,

hier ist ein Lösungsansatz für deine Aufgabe

Code:
$ cat test.txt
anfang 1234567890 1234567890  ende
$ cat test.txt | sed "s/\([0-9]\{1\}\)\([0-9]\{5\}\)\([0-9]\{4\}\)/\1.\2.\3/1"
anfang 1.23456.7890 1234567890  ende
Im Ausgangstext werden Gruppen von 10 Ziffern in 3 Teilgruppen à 1,5 und 4 Ziffern zerlegt. Mit \1.\2.\3 werden die 3 Gruppen ausgeben und dazwischen Punkt eingefügt. /1 bewirkt, dass der substitute Befehl nur einmal ausgeführt wird.

Gruß
Georg
 
Vielen Dank, das war die nötige hilfe um vorwärts zu kommen.

Code:
cat test.txt | grep code135 | sed -i "s/\([0-9]\{1\}\)\([0-9]\{5\}\)\([0-9]\{4\}\)/\1.\2.\3/1"
fördert aber einen Fehler hervor:
sed: kann - nicht lesen: Datei oder Verzeichnis nicht gefunden

Wie kann ich an Sed den korrekten Dateinamen übergeben? vlt. '{}'?
Schon probiert funktioniert nicht.

Code:
sed -i "s/\([0-9]\{1\}\)\([0-9]\{5\}\)\([0-9]\{4\}\)/\1.\2.\3/1"
 test.txt
funktioniert einwandfrei. Hat aber den Nachteil, dass eventuell eine Zehnstellige Nummer vor dem Code135 auftaucht und dann wäre das Pulver verschossen.

Hast du da ne idee oder geht das so nicht? Sed streamt ja immer die ganze Datei. Ich würde aber gerne nur den Code135 ändern.
 
Hi,

ich muss gleich wieder weg, deshalb habe ich heute keine Zeit zum ausprobieren. Aber ich würde die Bedingung in das Suchmuster einbauen

etwa so
Code:
sed -i "s/code135 * \([0-9]\{1\}\)\([0-9]\{5\}\)\([0-9]\{4\}\)/\1.\2.\3/1"
Ich weiss jetzt nicht ob der * als Wildcard so funktioniert wie du es brauchst. Eventuell musst du ein bisschen variieren.

Gruß
Georg
 
Oben