Noch ein SED-Problem

J

jurgen_xf

Mitglied
Wieder mal ein SED Anfängerproblem........

Ich bearbeite stündlich mit der ksh eine Textdatei (update.txt) mit folgendem Eintrag:
Code:
/inputfile/data/xxx/yyy/update/dateiname_20110128.txt,123,LED,31....
/inputfile/data/xxx/yyy/update/dateiname_20110127.txt,128,EPF,11....
....
Die Länge der Zeile und der dateiname varriiert,- doch vor dem .txt steht immer das Datum,- dies möchte ich kopieren und in den Pfad hinter update einfügen,- und das sollte dann rauskommen:
Code:
/inputfile/data/xxx/yyy/update/20110128/dateiname_20110128.txt,123,LED,31....
/inputfile/data/xxx/yyy/update/20110127/dateiname_20110127.txt,128,EPF,11....
....
Weiß jemand eine schnelle Lösung?
Vielen Dank im Voraus
 
Zuletzt bearbeitet:
Könnte so funktionieren:
Code:
sed -e 's|/[^/]*_\([0-9]*\).txt|/\1&|'
Gruss, A.
 
Könnte so funktionieren:
Code:
sed -e 's|/[^/]*_\([0-9]*\).txt|/\1&|'
Gruss, A.

danke... irgendwie gibt die Shell mir aus, daß sie die Einträge nicht findet...mache scheinbar nen grundlegenden Fehler wie ich die zieldatei angebe...
Code:
$inputdirectory/input.txt sed -e 's|/[^/]*_\([0-9]*\).txt|/\1&|'
meldung der shell: /inputfile/data/xxx/yyy/update/dateiname_20110127.txt,128,EPF,11 not found


Gruss Jurgen
 
Hoi,

wenn du das wirklich so aufrufst, wie angegeben, interpretiert die Shell das '$inputdirectory/input.txt' als das auszuführende Programm - und das funktioniert dann natürlich nicht; versuchs doch einfach mal mit
Code:
sed -e 's|/[^/]*_\([0-9]*\).txt|/\1&|' <$inputdirectory/input.txt

Gruss, A.
 
Hoi,

wenn du das wirklich so aufrufst, wie angegeben, interpretiert die Shell das '$inputdirectory/input.txt' als das auszuführende Programm - und das funktioniert dann natürlich nicht; versuchs doch einfach mal mit
Code:
sed -e 's|/[^/]*_\([0-9]*\).txt|/\1&|' <$inputdirectory/input.txt

Gruss, A.
getan...die Fehlermeldung "not found" verschwindet aber die Quelldatei bleibt unverändert....irgendwie macht er gar nix
 
"Gar nix" sollte nicht sein. Die korrekte Ausgabe sollte Dir auf der Konsole ausgegeben werden (das '<' vor dem Dateinamen kannst Du uebrigens weglassen). 'sed' schreibt standardmaessig auf die Konsole. Wenn Du das Ergebnis speichern willst, musst Du es umleiten:
Code:
sed -e 's|/[^/]*_\([0-9]*\).txt|/\1&|' $inputdirectory/input.txt > korrigierteDatei.text
Du kannst _NICHT_ in die gleiche Datei umleiten - sie wuerde von der Shell erst geleert werden, bevor der Inhalt von sed bearbeitet wird.
Wenn Du die Aenderung in der gleichen Datei gespeichert haben moechtest, musst Du entweder 'korrigierteDatei.text' nach dem Aufruf umbenennen, oder Du benutzt sed mit der Option '-i'. Das funktioniert allerdings nur fuer GNU sed (unter Linux duerfte das der Fall sein):
Code:
sed -i -e 's|/[^/]*_\([0-9]*\).txt|/\1&|' $inputdirectory/input.txt
 
Irgendwie komme ich mit SED nicht ans Ziel. Der oben beschriebene Ansatz verändert nichts. Die Datei sieht genauso aus wie die Zieldatei. Ich habe einen anderen Lösungsansatz mit Perl bekommen. Damit haut es (fast) hin. Die Ausgabe ist von der Struktur her so wie ich sie haben möchte, nur kommen alle Zeilen doppelt vor.
Code:
perl -p -i.old -nle 's/\/(\w+)(\d{8})/\/\2\/\1\2/;print $_;' $inputdirectory/update.txt

woran liegt denn das nun schon wieder????
 
Lass mal den 'print $_;'-Befehl weg; die Ausgabe erzeugst du ja schon mit der '-p'-Option beim Perl-Aufruf ...

Was bekommst du mit
Code:
perl -p -i.old -e 's/\/(\w+)(\d{8})/\/\2\/\1\2/;' $inputdirectory/update.txt
(also auch ohne die Optionen '-l' und '-n')?

A.
 
Es funktioniert. Vielen Dank für die Hilfe an alle.
 
Zurück
Oben