php - Hvordan ændrer jeg filslutningerne til enten Windows eller Mac-filen i Linux?

Indlæg af Hanne Mølgaard Plasc

Problem



Når jeg gemmer en TSV-fil i Windows fra Excel, bruger den linjens slutning af \ r eller \ 015 (oktal), som dukker op i vi som ^ M.


Når jeg gemmer en TSV-fil på Mac'en fra Excel, bruger den linjens slutning af \ r \ n eller \ 015 \ 012 (oktal), som dukker op i vi som ^ M.


Hvordan håndterer jeg linjens slutninger på begge filer uden at tilføje ekstra tomme linjer, men stadig opretholde linux-kompatible linjestykker?


Jeg bruger for tiden exec () i PHP for at køre følgende:


Hvis jeg bruger:


cat {FILE} | tr -d "15" > {NEW\_FILE}


eller


cat {FILE} | tr -d "
" > {NEW\_FILE}


Fungerer til Windows-filer, men Mac-filer fejler. (fjerner alle linjestykker)


Hvis jeg bruger:


cat {FILE} | tr "15" "12" > {NEW\_FILE}


eller


cat {FILE} | tr "
" "
" > {NEW\_FILE}


Fungerer til Mac-filer, men Windows-filer fejler. (skaber tomme linjer)


Eventuelle ideer, hvordan man håndterer enten inden for samme rutine?

Bedste reference


Jeg synes jeg fandt en elegant løsning på dette problem. I mit PHP script oprettede jeg følgende:


$results = exec("cd $directory; grep -Pl $'
' $filename");
if($results == $filename) {
    // Windows File (default)
    exec("cd $directory; cat $filename | tr -d '15' > $tmpfile; mv $tmpfile $filename");      
} else {
    // MAC File
    exec("cd $directory; cat $filename | tr '
' '
' > $tmpfile; mv $tmpfile $filename");  
}


Jeg er åben for forbedringer, hvis nogen har en.

Andre referencer 1


dos2unix til Windows-filer og Mac2unix til Mac-filer.