
16568
14.05.2013
Suche Code-Schnippsel für die Konsole für massenhaftes Inhaltsersetzen
Hallo zusammen,
vielleicht kennt jemand das Problem:
in verschiedenen Dateien muß Text ersetzt werden.
Über die Konsole.
Es ist nicht ein Wort, sondern ein richtig ellenlanger Absatz.
Es gibt aber eine Start- und End-Marke.
Hat hierzu jemand schon einen Schnippsel, der den zu ersetzenden Text aus Datei A holt, und den Lückenfüller aus Datei B?
grep, find, sed und awk sind meine Freunde, jedoch habe ich einen Abschnitt von ca. 200 Zeilen, der in ca. 2.000 Dateien ersetzt werden muß, und dummerweise enthält der mehrere Sonderzeichen...
Leider sind das ein paaaaar GB an Daten, und die lade ich mir nur ungern komplett runter, um sie dann durch geeignete Programme auf meiner Kiste durchzuforsten
Anfang des zu ersetzenden Textes:
<? /* Kommentar */
Ende des zu ersetzenden Textes:
/* Ende Codeblock */ ?>
Wird ersetzt durch:
<? /* Kommentar neu */>
hier PHP-Code
/* Ende neuer Kommentar */ ?>
Any clues?
Grüße
Lonesome Walker
vielleicht kennt jemand das Problem:
in verschiedenen Dateien muß Text ersetzt werden.
Über die Konsole.
Es ist nicht ein Wort, sondern ein richtig ellenlanger Absatz.
Es gibt aber eine Start- und End-Marke.
Hat hierzu jemand schon einen Schnippsel, der den zu ersetzenden Text aus Datei A holt, und den Lückenfüller aus Datei B?
grep, find, sed und awk sind meine Freunde, jedoch habe ich einen Abschnitt von ca. 200 Zeilen, der in ca. 2.000 Dateien ersetzt werden muß, und dummerweise enthält der mehrere Sonderzeichen...
Leider sind das ein paaaaar GB an Daten, und die lade ich mir nur ungern komplett runter, um sie dann durch geeignete Programme auf meiner Kiste durchzuforsten
Anfang des zu ersetzenden Textes:
<? /* Kommentar */
Ende des zu ersetzenden Textes:
/* Ende Codeblock */ ?>
Wird ersetzt durch:
<? /* Kommentar neu */>
hier PHP-Code
/* Ende neuer Kommentar */ ?>
Any clues?
Grüße
Lonesome Walker
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 206441
Url: https://administrator.de/forum/suche-code-schnippsel-fuer-die-konsole-fuer-massenhaftes-inhaltsersetzen-206441.html
Ausgedruckt am: 16.05.2025 um 23:05 Uhr
5 Kommentare
Neuester Kommentar

Hallo Lonesome Walker,
ist denn der neue Text bei jedem Vorkommen ein anderer? oder anders gefragt, sind A und B jeweils ein Datei-Paar und davon gibt es viele? oder gibt es nur eine Datei B?
Zum Vorgehen. Ich mach sowas mit Perl. Wenn man dort setzt, werden die Zeilentrenner nicht mehr als Trenner für die Strings benutzt und man kann eine Datei komplett als String einlesen. Damit ist das ersetzen mittels s/altertext/neuertext/g relativ simpel.
Wenn Du mit sed arbeitest, wird es wohl etwas umständlicher. Ich würde Dir raten hier unter Punkt 4. Examples oder hier mal nach fertigen Skripts zu suchen (wenn Du diese Seiten nicht sowieso schon kennst).
Wenn ich mal eine Beispieldatei sehen könnte, dann würde ich ein bisschen Perlcode posten.
Markus
ist denn der neue Text bei jedem Vorkommen ein anderer? oder anders gefragt, sind A und B jeweils ein Datei-Paar und davon gibt es viele? oder gibt es nur eine Datei B?
Zum Vorgehen. Ich mach sowas mit Perl. Wenn man dort
undef $/ ;
Wenn Du mit sed arbeitest, wird es wohl etwas umständlicher. Ich würde Dir raten hier unter Punkt 4. Examples oder hier mal nach fertigen Skripts zu suchen (wenn Du diese Seiten nicht sowieso schon kennst).
Wenn ich mal eine Beispieldatei sehen könnte, dann würde ich ein bisschen Perlcode posten.
Markus

Wenn ich nachher zu hause bin werde ich mal ein Skript basteln.
Man kann bei Perl den Trenner für die Ersetzungen selbst festlegen. Wenn also z.B. kein '#' im Text vorkommt, dann nehme ich das.
Markus
Man kann bei Perl den Trenner für die Ersetzungen selbst festlegen. Wenn also z.B. kein '#' im Text vorkommt, dann nehme ich das.
Markus

Also wenn Datei A so aussiehtund Datei B so aussieht: dann führt dieser Code
zu dieser Ausgabe
Was ungefähr Deinen Vorstellungen entsprechen müsste.
Nun kann man natürlich noch dafür sorgen, dass alle Dateien geöffnet werden anstatt nur eine, die Ausgabe wieder in die Datei geschrieben wird usw. Aber ich hatte Dich so verstanden, dass die regex das eigentliche Problem sind.
Markus
bla blubber
<? /* Kommentar */
<?php
/* Inkludierung von notwendigen Files Anfang */
include('1.inc.php');
include('2.inc.php');
include('3.inc.php');
/* Inkludierung von notwendigen Files Ende */
/* Deklaration von Klassen Anfang */
class TestClass {
public $strPub = "Ich bin public";
protected $strProt = "Ich bin protected";
private $strPriv = "Ich bin private";
function showVars() {
echo "Das sieht die Klasse TestClass:\n";
echo "\$strPub: $this->strPub\n";
echo "\$strProt: $this->strProt\n";
echo "\$strPriv: $this->strPriv\n";
echo "\n";
}
}
/* Deklaration von Klassen Ende */
?>
/* Ende Codeblock */ ?>
bla blubber
hier steht nur text
<? /* Kommentar neu */>
und hier irgendwas
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
verschiedene Zeichen
#/;\{}()%&/()=?$§"!
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
hier PHP-Code
/* Ende neuer Kommentar */ ?>
hier steht nur text
hier steht nur text
hier steht nur text
hier steht nur text
hier steht nur text
hier steht nur text
hier steht nur text
hier steht nur text
#!/usr/bin/perl
use strict ;
use warnings ;
use feature 'say' ;
open DATEI_B, "datei_b.txt" or die "geht nicht $!\n" ;
undef $/ ;
my $newtxt ;
while ( <DATEI_B> ) {
if ( $_ =~ m;(\<\?\s/\*\sKommentar\sneu\s\*/\>.*?/\*\sEnde\sneuer\sKommentar\s\*/\s\?\>);gs ) {
$newtxt = $1 ;
}
}
open DATEI_A, "datei_a.html" or die "geht nicht $!\n" ;
my $datei_a = <DATEI_A> ;
undef $/ ;
$datei_a =~ s;\<\?\s/\*\sKommentar\s\*/.*?/\*\sEnde\sCodeblock\s\*/\s\?\>;$newtxt;gs ;
say $datei_a ;
bla blubber
<? /* Kommentar neu */>
und hier irgendwas
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
verschiedene Zeichen
#/;\{}()%&/()=?$§"!
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
und so weiter
hier PHP-Code
/* Ende neuer Kommentar */ ?>
bla blubber
Nun kann man natürlich noch dafür sorgen, dass alle Dateien geöffnet werden anstatt nur eine, die Ausgabe wieder in die Datei geschrieben wird usw. Aber ich hatte Dich so verstanden, dass die regex das eigentliche Problem sind.
Markus