문제

파일에서 특정 줄을 덮어 쓰는 가장 좋은 방법은 무엇입니까? 나는 기본적으로 문자열 '@parsethis'에 대한 파일을 검색하고 다른 줄의 나머지 부분을 다른 줄로 덮어 쓰고 싶습니다.

도움이 되었습니까?

해결책

파일이 너무 크지 않으면 가장 좋은 방법은 파일을 라인 배열로 읽는 것입니다. 파일(), 스트링에 대한 선 배열을 검색하고 해당 라인을 편집 한 다음 implode () 배열이 함께 돌아 왔습니다 fwrite () 파일로 돌아갑니다.

다른 팁

파일이 실제로 크고 (로그 파일 또는 이와 같은), 메모리 소비를 위해 속도를 기꺼이 희생하려는 경우 두 파일을 열고 본질적으로 트릭을 수행 할 수 있습니다. 제레미 루텐 시스템 메모리 대신 파일을 사용하여 제안했습니다.

$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()) 그리고 전화 ftell() 위치를 저장하려면 전화하기 전에 매번 라인이 시작됩니다. fgets() 줄을 읽습니다. 덮어 쓰고 싶은 줄을 찾으면 사용할 수 있습니다. fseek() 줄의 시작으로 돌아가서 fwrite() 새로운 데이터. 라인을 항상 같은 길이로 강제하는 한 가지 방법은 우주를 가능한 최대 길이로 패드하는 것입니다.

또는 파일이 너무 크지 않은 경우 :

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

파일에 존재하지 않는 Delimiters '#'를 선택해야합니다.

이것은 PHP의 SED와 함께 파일의 한 줄만 재 작성하는 데 적합한 솔루션입니다. 내 파일은 Style vars 만 포함하고 형식이 있습니다 : $ 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. 따라서 백업이 성공적으로 이루어지지 않는 한 첫 번째 단계가 파일을 덮어 쓰는 것을 방지하는 경우 두 번째 단계 만 실행할 수 있습니다. 체크 아웃 :

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

누군가에게 유용한 희망.

건배

아드리안

나는 제레미가 제안한 것을 할 가능성이 높지만, 여기서는 다른 방법으로 다른 해결책이 있습니다. 이것은 테스트 또는 사용되지 않았으며 *닉스 시스템에 사용됩니다.

$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