Frage

Was ist der beste Weg, um eine bestimmte Zeile in einer Datei zu überschreiben? Ich mag im Grunde eine Datei für die Zeichenfolge suchen ‚@parsethis‘ und überschreiben Sie den Rest der Zeile mit etwas anderem.

War es hilfreich?

Lösung

Wenn die Datei nicht zu groß ist, wäre der beste Weg, wahrscheinlich die Datei in ein Array von Zeilen mit Datei zu lesen () , Suche durch die Anordnung von Linien für die Zeichenfolge und bearbeiten diese Zeile, dann implodieren () das Array wieder zusammen und fwrite () es zurück in die Datei.

Andere Tipps

Wenn die Datei sehr groß ist (Log-Dateien oder ähnliches), und Sie sind bereit, den Speicherverbrauch zu opfern Geschwindigkeit für zwei Dateien öffnen konnte und tun im Wesentlichen den Trick Jeremy Ruten mithilfe von Dateien anstelle des Systemspeichers vorgeschlagen.

$source='in.txt';
$target='out.txt';

// copy operation
$sh=fopen($source, 'r');
$th=fopen($target, 'w');
while (!feof($sh)) {
    $line=fgets($sh);
    if (strpos($line, '@parsethis')!==false) {
        $line='new line to be inserted' . PHP_EOL;
    }
    fwrite($th, $line);
}

fclose($sh);
fclose($th);

// delete old source file
unlink($source);
// rename target file to source file
rename($target, $source);

Ihr Hauptproblem ist die Tatsache, dass die neue Linie nicht die gleiche Länge wie die alte Linie sein kann. Wenn Sie die Länge der Linie ändern müssen, gibt es keinen Ausweg zumindest alle der Datei nach der geändertenen Zeile neu zu schreiben. Der einfachste Weg ist es, eine neue, geänderte Datei zu erstellen und es dann über die ursprünglichen zu bewegen. Auf diese Weise gibt es eine komplette Datei jederzeit für die Leser zur Verfügung. Sperren verwenden, um sicherzustellen, dass nur ein Skript, um die Datei auf einmal wird modifiziert, und da Sie gehen, um die Datei, führen Sie die Verriegelung auf eine andere Datei zu ersetzen. Check out flock().

Wenn Sie sicher sind, dass die neue Linie die gleiche Länge wie die alte Linie sein wird, können Sie die Datei öffnen im Lese- / Schreibmodus (Verwendung r+ als zweites Argument fopen()) und ftell() rufen Sie die Position, die Linie zu sparen zu jedem Zeitpunkt beginnt, bevor Sie fgets() eine Zeile lesen nennen. Sobald Sie die Zeile, die Sie überschreiben möchten, können Sie fseek() gehen zurück an den Anfang der Zeile und fwrite() die neuen Daten verwenden. Eine Möglichkeit, die Linie zu zwingen, immer die gleiche Länge ist auf Platz Pad es aus auf die maximal mögliche Länge.

oder wenn die Datei nicht zu groß ist:

$sample = file_get_contents('sample');
$parsed =preg_replace('#@parsethis.*#', 'REPLACE TO END OF LINE', $sample);

Du musst Begrenzungszeichen ‚#‘ wählen, wenn auch nicht in der Datei vorhanden sind.

Dies ist eine Lösung, die zum Umschreiben nur eine Zeile einer Datei anstelle arbeitet mit von PHP sed. Meine Datei enthält nur Stil Vars und formatiert: $ StyleVarName: styleVarProperty; \ n
Für diese erste füge ich die „:“ an den Enden der myStyleVarName und sed den Rest dieser Zeile mit der neuen Eigenschaft ersetzt und fügt ein Semikolon. Stellen Sie sicher, dass Zeichen in myStyleVarProp richtig entkommen.

$command = "pathToShellScript folder1Name folder2Name myStyleVarName myStyleVarProp";
shell_exec($command);

/* shellScript */
#!/bin/bash
file=/var/www/vhosts/mydomain.com/$1/$2/scss/_variables.scss
str=$3"$4"
sed -i "s/^$3.*/$str;/" $file

Wenn Sie möchten, um vollständig den Inhalt einer Datei mit dem Inhalt einer anderen Datei ersetzen Sie diese verwenden können:

rename("./some_path/data.txt", "./some_path/data_backup.txt");
rename("./some_path/new_data.txt", "./some_path/data.txt");

So in der ersten Zeile Sicherung Sie die Datei und in der zweiten Zeile die Datei mit dem Inhalt einer neuen Datei ersetzen.

Soweit ich das Umbenennungs sagen kann, einen Booleschen Wert zurück. Wahr, wenn der Umbenennungs erfolgreich ist und falsch, wenn es fehlschlägt. Man könnte also laufen nur den zweiten Schritt, wenn der erste Schritt erfolgreich ist, überschreiben Sie die Datei zu verhindern, es sei denn, ein Backup erfolgreich durchgeführt wurde. Check out:

https://www.php.net/manual/en/function .rename.php

Hope, das jemandem nützlich ist.

Prost

Adrian

Ich würde wahrscheinlich tun, was Jeremy vorgeschlagen, aber nur für eine alternative Art und Weise ist es hier eine andere Lösung zu tun. Dies wird nicht getestet oder verwendet worden und ist für * nix-Systeme.

$cmd = "grep '@parsethis' " . $filename;
$output = system($cmd, $result);
$lines = explode("\n", $result);
// Read the entire file as a string
// Do a str_repalce for each item in $lines with ""
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top