覆盖文件中特定行的最佳方法是什么?我基本上想要在文件中搜索字符串'@parsethis',并用其他内容覆盖该行的其余部分。

有帮助吗?

解决方案

如果文件不是太大,最好的方法可能是使用文件将文件读入一行数组(),搜索字符串数组并编辑该行,然后 implode()数组重新组合在一起并 fwrite()将其恢复为文件。

其他提示

如果文件非常大(日志文件或类似的东西)并且你愿意牺牲内存消耗的速度,你可以打开两个文件,基本上可以做到这一点 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);

您的主要问题是新行的长度可能与旧行的长度不同。如果您需要更改行的长度,则无法在更改的行之后重写至少所有文件。最简单的方法是创建一个新的,修改过的文件,然后将其移到原始文件上。这样,读者可以随时获得完整的文件。使用锁定确保一次只有一个脚本正在修改文件,并且由于您要替换该文件,请对另一个文件执行锁定。查看 flock()

如果您确定新行的长度与旧行的长度相同,则可以以读/写模式打开文件(使用 r + 作为 fopen的第二个参数())并在调用 fgets()读取一行之前,调用 ftell()来保存每行开始的位置。一旦找到要覆盖的行,就可以使用 fseek()返回到行的开头,并使用 fwrite()新数据。强制线始终保持相同长度的一种方法是将其填充到最大可能的长度。

或者如果您的文件不是太大:

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

您必须选择文件中不存在的分隔符'#'。

这是一个解决方案,只能使用来自PHP的sed重写文件的一行。我的文件只包含样式变量并且格式化: $ 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");

因此,在第一行备份文件,在第二行中,将文件替换为新文件的内容。

据我所知,重命名返回一个布尔值。如果重命名成功则为True,如果失败则为false。因此,如果第一步成功防止覆盖文件,除非已成功完成备份,否则只能运行第二步。退房:

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

希望这对某人有用。

干杯

阿德里安

我很可能会做Jeremy所建议的,但只是另一种方法来做到这一点是另一种解决方案。这尚未经过测试或使用,适用于* 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