Question

Quel est le meilleur moyen d'écraser une ligne spécifique dans un fichier? Je veux fondamentalement chercher dans un fichier la chaîne '@parsethis' et écraser le reste de cette ligne avec autre chose.

Était-ce utile?

La solution

Si le fichier n'est pas trop volumineux, le meilleur moyen serait probablement de le lire dans un tableau de lignes contenant le fichier. () , recherchez votre chaîne dans le tableau de lignes et modifiez-la, puis implode () retournez le tableau et fwrite () dans le fichier.

Autres conseils

Si le fichier est vraiment volumineux (fichiers journaux ou quelque chose comme cela) et que vous êtes prêt à sacrifier la vitesse pour la consommation de mémoire, vous pouvez ouvrir deux fichiers et faire l’essentiel du travail Jeremy Ruten proposé en utilisant des fichiers à la place de la mémoire système.

$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);

Votre principal problème est le fait que la nouvelle ligne peut ne pas avoir la même longueur que l’ancienne. Si vous devez modifier la longueur de la ligne, vous ne pouvez pas réécrire au moins tout le fichier après la ligne modifiée. Le moyen le plus simple consiste à créer un nouveau fichier modifié, puis à le déplacer sur le fichier d'origine. De cette façon, il existe un fichier complet disponible à tout moment pour les lecteurs. Utilisez le verrouillage pour vous assurer qu'un seul script modifie le fichier à la fois et, puisque vous allez remplacer le fichier, verrouillez-le sur un autre fichier. Découvrez flock () .

Si vous êtes certain que la nouvelle ligne aura la même longueur que l'ancienne, vous pouvez ouvrir le fichier en mode lecture / écriture (utilisez r + comme second argument de fopen () ) et appelez ftell () pour enregistrer la position à laquelle la ligne commence à chaque fois avant d'appeler fgets () pour lire une ligne. Une fois que vous avez trouvé la ligne que vous voulez écraser, vous pouvez utiliser fseek () pour revenir au début de la ligne et fwrite () pour les nouvelles données. Une façon de forcer la ligne à toujours avoir la même longueur consiste à la remplir de la manière la plus longue possible.

ou si votre fichier n'est pas trop volumineux:

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

Vous devrez cependant choisir les délimiteurs '#' qui ne figurent pas dans le fichier.

C’est une solution qui fonctionne pour la réécriture d’une seule ligne d’un fichier à la place de sed depuis PHP. Mon fichier ne contient que des styles de style et est formaté: $ styleVarName: styleVarProperty; \ n
Pour cela, j’ajoute d’abord le ": " aux fins de myStyleVarName, et sed remplace le reste de cette ligne par la nouvelle propriété et ajoute un point-virgule. Assurez-vous que les caractères sont correctement protégés dans myStyleVarProp.

$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

Si vous souhaitez remplacer complètement le contenu d'un fichier par le contenu d'un autre fichier, vous pouvez utiliser ceci:

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

Donc, dans la première ligne, vous sauvegardez le fichier et dans la deuxième ligne, vous remplacez le fichier par le contenu d'un nouveau fichier.

Autant que je sache, renommer renvoie un booléen. Vrai si le changement de nom est réussi et faux s'il échoue. Par conséquent, vous ne pouvez exécuter la deuxième étape que si la première étape réussit à empêcher le remplacement du fichier, sauf si une sauvegarde a été effectuée avec succès. Départ:

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

J'espère que cela vous sera utile.

A bientôt

Adrian

Je ferais très probablement ce que Jeremy a suggéré, mais juste pour une autre manière de le faire, voici une autre solution. Ceci n'a pas été testé ni utilisé et concerne les systèmes * nix.

$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 ""
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top