necroscope
Goto Top

Dateien mit Sed bearbeiten

Guten Morgen.

Ich muss viele Dateien für eine Datenmigration Nachbearbeiten und würde gerne dafür Sed benutzen.

Aufgabe: an Zeile 6 ein " anhängen/tauschen weil es dort fehlt. es wurden nur 256 Zeichen ausgelesen.

C:\>sed 6s/.\{1\}$/\"/ d:\P0249902.jpl liefert das gewünschte Ergebnis auf dem Monitor, aber wie schreibt er es zurück in die Datei?

C:\>sed 6s/.\{1\}$/\"/ d:\P0249902.jpl > d:\P0249902.jpl funktioniert nicht.

Content-Key: 196469

Url: https://administrator.de/contentid/196469

Printed on: April 25, 2024 at 01:04 o'clock

Member: Alchimedes
Alchimedes Jan 04, 2013 at 10:48:04 (UTC)
Goto Top
Hallo,

um in eine Datei zu schreiben nutze die option -w

http://openbook.galileocomputing.de/shell_programmierung/shell_014_000. ...


Gruss
Member: Necroscope
Necroscope Jan 04, 2013 at 11:30:55 (UTC)
Goto Top
Ja aber wohin mit der Option?
Member: Alchimedes
Alchimedes Jan 04, 2013 at 11:55:53 (UTC)
Goto Top
Hallo,

das Sed Tutorial erklaert es doch ganz gut.

Aus Openbooks
Das entsprechende Gegenstück zum Kommando r erhalten Sie mit dem Kommando w, mit
dem Sie das Ergebnis von sed in einer Datei speichern können:

you@host > sed -n '/USA/w USA.dat' mrolympia.dat
you@host > cat USA.dat
Larry Scott USA 1965 1966
Sergio Oliva USA 1967 1968 1969
Chris Dickerson USA 1982
Lee Haney USA 1984 1985 1986 1987 1988 1989 1990 1991
Ronnie Coleman USA 1998 1999 2000 2001 2002 2003 2004


So muesste das jetzt gehen.

C:\>sed 6s/.\{1\}$/\"/w d:\P0249902.jpl

Gruss
Member: Necroscope
Necroscope Jan 04, 2013 at 12:12:18 (UTC)
Goto Top
schon probiert aber dann kommt dies hier:

D:\Downloads\GetGnuWin32\bin>sed 6s/.\{1\}$/\"/w d:\P0249902.jpl
sed: couldn't open file : No such file or directory

D:\Downloads\GetGnuWin32\bin>cat d:\P0249902.jpl | sed 6s/.\{1\}$/\"/w out.txt
sed: couldn't open file : No such file or directory
Member: Alchimedes
Alchimedes Jan 04, 2013 at 12:19:59 (UTC)
Goto Top
Hallo,

Ist ja Ploetzlich eine ganz Andere Aufgabenstellung!!
das ist naturlich klar das das nicht geht.

Weil Sed liest aus einer Datei... Du willst aber eine Datei nach sed reinschieben...
D:\Downloads\GetGnuWin32\bin>(<---das hier geht nicht!) sed 6s/.\{1\}$/\"/w d:\P0249902.jpl

Nimm Dir Zeit und arbeite das Tutorial durch.
Das hilft Dir auf dauer nichts wenn ich Dir hier ne Loesung reinpruegel
die Du nicht verstehst.

Gruss
Member: Necroscope
Necroscope Jan 04, 2013 at 12:35:31 (UTC)
Goto Top

Nimm Dir Zeit und arbeite das Tutorial durch.
Das hilft Dir auf dauer nichts wenn ich Dir hier ne Loesung reinpruegel
die Du nicht verstehst.


ja wieso kann ich das was auf dem Bildschirm richtig angezeigt wird nicht in eine Datei schreiben?

you@host > sed -n '/USA/w USA.dat' mrolympia.dat

das würde für mich bedeuten: sed 6s/.\{1\}$/\"/w d:\P0249902.jpl d:\P0249902.jpl

geht aber auch nicht.
Member: Alchimedes
Alchimedes Jan 04, 2013 at 12:45:05 (UTC)
Goto Top
Weil das
you@host > sed -n '/USA/w USA.dat' mrolympia.dat

was anderes ist als das

D:\Downloads\GetGnuWin32\bin>sed 6s/.\{1\}$/\"/w d:\P0249902.jpl
Member: Necroscope
Necroscope Jan 04, 2013 at 13:29:08 (UTC)
Goto Top
Die Syntax ist wohl unterschiedlich in den Beispielen.

Per Try n Error hab ich mit diesem Befehl
sed -n "6s/.\{1\}$/\"/w d:\out2.txt" d:\P0249902.jpl

eine Datei erstellen können, aber da steht dann nur die geänderte Zeile drin und nicht das was vorher alles zu sehen war.
Member: Lochkartenstanzer
Lochkartenstanzer Jan 04, 2013 updated at 18:13:14 (UTC)
Goto Top
-i

Nachtrag:

C:\>sed 6s/.\{1\}$/\"/ -i d:\P0249902.jpl

should do the job.

lks
Member: paulepank
paulepank Jan 04, 2013, updated at Jan 05, 2013 at 07:11:47 (UTC)
Goto Top
Hallo Necroscope,

C:\>sed 6s/.\{1\}$/\"/ d:\P0249902.jpl liefert das gewünschte Ergebnis auf dem Monitor
aber mit Syntaxfehler

C:\>sed 6s/.\{1\}$/\"/ d:\P0249902.jpl > d:\P0249902.jpl funktioniert nicht.
wegen Syntaxfehler

Machs so:
füge ein Caret ein (^)
C:\>sed 6s/.\{1\}$/\^"/ d:\P0249902.jpl > d:\neuP0249902.jpl  

getestet in der cmd unter XP und es funktioniert.

cu paulepank

EDIT:
Name der Ausgabedatei geändert
Member: Lochkartenstanzer
Lochkartenstanzer Jan 04, 2013 updated at 18:15:43 (UTC)
Goto Top
Zitat von @Necroscope:

ja wieso kann ich das was auf dem Bildschirm richtig angezeigt wird nicht in eine Datei schreiben?

Weil Du die Ausgabe in eine Datei lenkst, die Du gerade als Input für sed nimmst.

würde ich jetzt vermuten.

lks
Member: Necroscope
Necroscope Jan 07, 2013 at 10:53:23 (UTC)
Goto Top
Zitat von @paulepank:

Machs so:
füge ein Caret ein (^)
C:\>sed 6s/.\{1\}$/\^"/ d:\P0249902.jpl > d:\neuP0249902.jpl  

getestet in der cmd unter XP und es funktioniert.

cu paulepank

EDIT:
Name der Ausgabedatei geändert


Danke so funktioniert es.

ich ändere aber auf .neu. das kann man dann besser mit nem rename *.neu *. lösen.

jetzt bleibt nur noch die Frage wie man den Sed Befehl auf alle Dateien in dem Ordner loslässt.

C:\>sed 6s/.\{1\}$/\^"/ d:\*.jpl > d:\*.neu funktioniert leider nicht wie bei rename.
Member: paulepank
paulepank Jan 08, 2013 at 21:43:20 (UTC)
Goto Top
Hallo,

jetzt bleibt nur noch die Frage wie man den Sed Befehl auf alle Dateien in dem Ordner loslässt.
mit einer FOR-Schleife.
Hilfe dazu u.a. hier im Forum z.B. in einem Tutorial und vielen Beispielen.
Dein eigentliches Problem ist m.E. gelöst.
Deshalb setze diesen Thread als gelöst und bastle an deiner Lösung.
Falls du nicht weiterkommst, veröffentliche deinen Code mit der FOR-Schleife in einem neuen Thread.
Da kann dir dann weitergeholfen werden.

cu paulepank
Member: Necroscope
Necroscope Jan 09, 2013 at 08:09:51 (UTC)
Goto Top
ach ja oh nee for schleife in ner Batch.
OK wird schon schief gehen.

Dankeschön
Member: paulepank
paulepank Jan 09, 2013 at 10:52:19 (UTC)
Goto Top
Hallo,
diesen Thread dann bitte als gelöst markieren
und wozu 'ne Batch, da das Ganze doch ein einmaliger Vorgang ist.
Das kannst du alles in einer Zeile erledigen, die du uns wahrscheinlich in einem neuen Thread vorstellst.

cu paulepank