ubuntuusers.de

In Textdatei an Byte xxx 20 Stellen ersetzen

Status: Gelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

kyxh2o

Anmeldungsdatum:
13. Mai 2009

Beiträge: Zähle...

Hallo,

ich bräuchte bitte Hilfe bei einer Problemlösung.

Per Bash-Script muss ich in Textdateien z.B. von Zeichen 1234 bis 1254 egal was dort steht (in der Regel Leerzeichen, kann aber auch bereits Text stehen, ist unterschiedlich) den dortigen Inhalt überschreiben. Eigentlich wollte ich das mit sed machen, aber scheinbar geht das nicht, da man dort nur nach regulären Ausdrücken suchen und diese ersetzen kann (sollte ich da falsch liegen, bin ich für Belehrung dankbar).

Hat jemand eine Idee wie ich das am sinnvollsten lösen kann?

Ich bedanke mich im vorraus für die Unterstützung!

kyxh2o

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Servus,

ein Aufteilen der Datei in zwei Stücke wäre ein Ansatz.

1
2
3
4
5
6
7
#!/bin/bash
(
	head -c 1233 foo.txt
	echo -n "Hier steht der neue Text. Ist egal, wie lang der ist."
	tail -c +1255 foo.txt
) > foo_neu.txt
mv foo_neu.txt foo.txt

Ohne Zwischendatei geht das auf diesem Wege allerdings nicht. Beachte das Pluszeichen vor der 1255 und die Tatsache, dass 1234 und 1254 nicht im Intervall enthalten sind. Ich habe dich zumindest so verstanden, dass du die Zeichen ab inklusive Position 1234 bis inklusive Position 1254 ersetzen willst.

Dein Threadtitel sagt etwas leicht anderes, in dem Fall wäre es dann „+1254“. Musst du mal schauen.

kyxh2o

(Themenstarter)

Anmeldungsdatum:
13. Mai 2009

Beiträge: 5

Das mit dem Aufteilen ist der Ansatz an dem ich auch gerade hing, so werde ich es machen.

Vielen Dank, Du hast mir sehr geholfen, vor allem durch die schnelle Antwort, denn das und noch vieles andere muss ich bis morgen früh fertig haben.

Noch mal herzlich Danke und ein schönes Wochenende!

kyxh2o

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Die "bessere" Version von sed ist Perl. (bei praktisch gleicher Syntax, kann aber auch mit Binärdateien umgehen)

Im Multiline-Modus kannst Du wunderschön Deine 1234 Zeichen markieren (und übernehmen) und danach die gewünschten 20 Zeichen austauschen:

perl -0777 -pe "s/(.{1234}).{20}/\1_hier_kommt_der_neue/s"

Diese Möglichkeit hatte ich hier schon mal ausführlich erklärt.

LG,

track

kyxh2o

(Themenstarter)

Anmeldungsdatum:
13. Mai 2009

Beiträge: 5

Danke für die Perl-Lösung, das wäre noch besser, da habe ich aber folgendes Problem. Was eingefügt werden soll ist eine 20-stellige Nummer. Wen ich es so mache:

1
perl -0777 -pe "s/(.{1234}).{20}/\1_12345678901234567890/s"

dann habe ich ein Byte zuviel, dann steht in der Ausgabe vor der Nummer noch ein Underline, also _12345678901234567890

Benutze ich diesen Code, also ohne den Unterstrich:

1
perl -0777 -pe "s/(.{1234}).{20}/\112345678901234567890/s"

klappt es nicht, die Ausgabedatei ist viel zu klein,

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Tjaaaa - dann müssen wir wohl mal in der Perl Doku nachgucken, was man da machen kann ...

Mit ein bisschen Suchen habe ich dazu etwas im PerlDoc zu "Regex" gefunden: dass man besser $1 statt \1 nehmen sollte, weil dass sonst mehrdeutig sein kann. (Oktalwerte werden nämlich auch mit Rückstrich geschrieben !)

Also wird das wohl am besten:

perl -0777 -pe "s/(.{1234}).{20}/\${1}12345678901234567890/s"

(Das $ muss hier escaped werden, damit die Shell nicht meint, das wäre ihre Variable !)

Und dann hätten wir es auch sauber ... 😀

LG,

track

kyxh2o

(Themenstarter)

Anmeldungsdatum:
13. Mai 2009

Beiträge: 5

Da ich gerade mit der head/tail Lösung fertig geworden bin, die Perl-Lösung jetzt aber auch einwandfrei funktioniert, kann ich mir jetzt aussuchen welche ich nehme ☺

Vielen Dank für Eure Unterstützung!!!!!

Antworten |