7
votes

Format Unix Format avec PowerShell

Comment créez-vous un format de fichier UNIX dans PowerShell? J'utilise les éléments suivants pour créer un fichier, mais cela le crée toujours au format Windows.

"hello world" | %{ $_.Replace("`r`n","`n") } | out-file -filepath test.txt -append


4 commentaires

Votre test ne fonctionne pas car il n'y a pas de crlf dans "Hello World"


@ x0n Lorsque vous l'avez écrit dans un fichier, le CR / LF est annexé à la ligne


C'est le point que j'essayais de faire. Clairement, votre opération Remplacer est avant le fichier écriture (out-fichier), donc si le fichier extérieur ajoute le CRLF, cela se produit après votre tentative de la remplacer.


Je sais que cela ne répond pas à votre question, mais vous pouvez vérifier s'il est abordable d'appeler Dos2unix sur la cible.


3 Réponses :


6
votes

Une réponse laïenne est (en prenant une entrée de Dos.txt Sortie à UNIX.TXT):

[string]::Join( "`n", (gc dos.txt)) | sc unix.txt


3 commentaires

Extension de votre solution, il existe en fait un moyen d'écrire les octets et évite la fin de la ligne DOS: SC UNIX.TXT ([[[] []] [Char []] "$ ContentText")


Bonne pensée, merci pour ça!


@ X0N Ceci termine également le fichier avec une ligne de gamme de style Windows (\ r \ n)



10
votes

Il existe une cmdlet dans le Extensions de la communauté PowerShell appelée Converto-UnixLineending


0 commentaires

4
votes

J'ai trouvé cette solution:

function ConvertTo-LinuxLineEndings($path) {
    $oldBytes = [io.file]::ReadAllBytes($path)
    if (!$oldBytes.Length) {
        return;
    }
    [byte[]]$newBytes = @()
    [byte[]]::Resize([ref]$newBytes, $oldBytes.Length)
    $newLength = 0
    for ($i = 0; $i -lt $oldBytes.Length - 1; $i++) {
        if (($oldBytes[$i] -eq [byte][char]"`r") -and ($oldBytes[$i + 1] -eq [byte][char]"`n")) {
            continue;
        }
        $newBytes[$newLength++] = $oldBytes[$i]
    }
    $newBytes[$newLength++] = $oldBytes[$oldBytes.Length - 1]
    [byte[]]::Resize([ref]$newBytes, $newLength)
    [io.file]::WriteAllBytes($path, $newBytes)
}


0 commentaires