Zeichenersetzung in Textfile

Hallo,

ich möchte in einem Textfile mit 180.000 Zeilen in jeder Zeile, an der Stelle 178-179, die bestehende Zeichnfolge ‚35‘ durch ‚50‘ ersetzen.

Weiß jemand wie der Befehl ausschauen muß?

Danke und Gruß
Marietta

Hallo Marietta,
ich gehe mal von einem System mit vorinstalliertem Perl (am besten irgendein **IX) aus.
Dann geht es am einfachsten mit:

perl -i.bak -pne 'substr($\_, 177, 2) = "50"' inputfile

Achtung:
es wird nicht geprüft,

  • ob alle Zeilen länger als 179 Zeichen sind
  • ob an der zu ersetzenden Position tatsächlich der STring „35“ steht

Bei Bedarf muß man den Perl-Einzeiler ein bischen ‚aufbohren‘. Die ursprüngliche Datei wird unter ‚inputfile.bak‘ gesichert, der geändert Inhalt steht direkt in ‚inputfile‘ (Namen natürlich anpassen.

Das ganze dürfte nur ein pass Sekunden dauern…

gruss
bernhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Dann geht es am einfachsten mit:

perl -i.bak -pne ‚substr($_, 177, 2) = „50“‘ inputfile

Achtung:
es wird nicht geprüft,

  • ob alle Zeilen länger als 179 Zeichen sind
  • ob an der zu ersetzenden Position tatsächlich der STring
    „35“ steht

Mir fällt dazu spontan das ein: (bin ein wenig eingerostet)

perl -e 'foreach() {print $\_ unless s/^(.{177})35(.\*$)\
/print $1."50".$2."\n"/gem;}' outputfile

Das sollte zu kurze und nicht passende Zeilen korrekt behandeln (sprich: ungeändert rausgeben).

Wenn hier jemand Ahnung von sed hat, hätte ich zu dem Thema auch noch 'ne Frage :wink:

perl -e ‚foreach() {print $_ unless
s/^(.{177})35(.*$)
/print $1.„50“.$2."\n"/gem;}‘ outputfile

Das sollte zu kurze und nicht passende Zeilen korrekt
behandeln (sprich: ungeändert rausgeben).

Wenn hier jemand Ahnung von sed hat, hätte ich zu dem Thema
auch noch 'ne Frage :wink:

Hi Nicos,
sorry für die späte Antwort - aber aus Performancesicht ist deine Lösung nicht die beste (und darum schien es doch zu gehen). Das Grouping im RE (also die runden Klammern), fressen ordentlich Zeit. Für solche fixen Ersetzungen ist substr() immer noch die bessere Wahl.

Probiers mal aus.

Die while()-Schleife kann man wie schon vorgeschlagen durch den Schalter -n wegrationalisieren.

Also jetzt mit Prüfung:

perl -i.bak -pne '
 if (length \> 179 and substr($\_, 177, 2) eq "35")
 {
 substr($\_, 177, 2) = "50";
 }
 # print erfolgt automatisch wg. -p-switch
' inputfile

gruss
bernhard

(bei sed kann ich glaube ich helfen - wenn nicht zu kompliziert. Einer meiner Lieblingslinks zu dem Thema ist http://www.unixguide.net/unix/sedoneliner.shtml )