質問

ファイルの特定の行を上書きする最良の方法は何ですか?基本的に、ファイルで文字列「@parsethis」を検索し、その行の残りを別のもので上書きします。

役に立ちましたか?

解決

ファイルが大きすぎない場合、おそらく最良の方法は、 fileを使用してファイルを行の配列に読み込むことです。 ()、文字列の行の配列を検索し、その行を編集してから、 implode()配列を一緒に戻し、 fwrite()をファイルに戻します。

他のヒント

ファイルが非常に大きく(ログファイルなど)、メモリ消費の速度を犠牲にしたい場合は、2つのファイルを開いて基本的に Jeremy Ruten は、システムメモリの代わりにファイルを使用して提案しました。

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

主な問題は、新しい行が古い行と同じ長さではない可能性があるという事実です。行の長さを変更する必要がある場合、変更された行の後に少なくともすべてのファイルを書き換える方法はありません。最も簡単な方法は、新しい変更されたファイルを作成してから、元のファイルの上に移動することです。このようにして、読者は常に完全なファイルを利用できます。ロックを使用して、一度に1つのスクリプトのみがファイルを変更していることを確認します。ファイルを置き換えるため、別のファイルに対してロックを実行します。 flock()をご覧ください。

新しい行が古い行と同じ長さになることが確実な場合は、ファイルを読み取り/書き込みモードで開くことができます( fopenの2番目の引数として r + を使用します) ())および ftell()を呼び出して、行を読み取る前に fgets()を呼び出す前に、行の開始位置を保存します。上書きしたい行が見つかったら、 fseek()を使用して行の先頭に戻り、新しいデータを fwrite()できます。行を常に同じ長さにする1つの方法は、可能な最大長までスペースを空けることです。

またはファイルが大きすぎない場合:

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

ファイルには存在しない区切り文字「#」を選択する必要があります。

これは、PHPのsedを使用してファイルの1行のみを書き換えるソリューションです。私のファイルにはスタイル変数のみが含まれ、フォーマットされています: $ styleVarName:styleVarProperty; \ n
このために、最初に":"を追加しますmyStyleVarNameの最後に追加すると、sedはその行の残りを新しいプロパティに置き換え、セミコロンを追加します。 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

あるファイルの内容を別のファイルの内容で完全に置き換えたい場合は、これを使用できます:

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

1行目でファイルをバックアップし、2行目でファイルを新しいファイルの内容に置き換えます。

名前の変更がブール値を返すことがわかる限り。名前の変更が成功した場合はtrue、失敗した場合はfalse。したがって、バックアップが正常に行われない限り、ファイルの上書きを防ぐために最初のステップが成功した場合にのみ、2番目のステップを実行できます。チェックアウト:

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

誰かに役立つことを願っています。

乾杯

エイドリアン

私はジェレミーが提案したことを行う可能性が高いですが、ここでそれを行う別の方法として、別の解決策があります。これはテストも使用もされておらず、* 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 ""
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top