2011-02-24 24 views
7

¿Cómo se crea un formato de archivo Unix en Powershell? Estoy usando lo siguiente para crear un archivo, pero siempre lo crea en el formato de Windows.Archivos de formato UNIX con Powershell

"hello world" | out-file -filepath test.txt -append 

Según entiendo, los caracteres de nueva línea CrLf hacen que sea un archivo de formato de Windows mientras que el formato UNIX necesita sólo un LF al final de la línea. He intentado sustituir el CRLF con lo siguiente, pero no funcionó

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

Su prueba no funciona porque no hay CRLF en "hola mundo" – x0n

+0

@ x0n cuando lo escribe en un archivo, entonces el cr/lf se agrega a la línea – aldrin

+0

ese es el punto que estaba tratando de hacer. claramente su operación de reemplazo es _antes de _ la escritura (archivo externo) así que si el archivo externo agrega el CRLF, sucede después de su intento de reemplazarlo. – x0n

Respuesta

5

Uno-fea buscando respuesta es (tomando el aporte de dos.txt dar salida a unix.txt):

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

pero Me gustaría poder hacer que Set-Content lo haga solo y esta solución no se transmite y por lo tanto no funciona bien en archivos grandes ...

Y esta solución terminará el archivo con una línea de DOS terminada también ... así que no es 100%

+5

Extendiendo su solución, de hecho hay una forma de escribir los bytes y evita la terminación de la línea DOS: sc unix.txt ([byte []] [char []] "$ contenttext") -Encadenando Byte – aldrin

+0

Buen pensamiento, gracias ¡para eso! –

+3

(gc dos.txt) -unirse "' n "> unix.txt – x0n

2

he encontrado que la solución:

sc unix.txt ([byte[]][char[]] "$contenttext") -Encoding Byte 

publicadas anteriormente, produce un error en la codificación conversiones en algunos casos.

lo tanto, aquí es otra solución (un poco más detallado, pero funciona directamente con bytes):

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) 
} 
Cuestiones relacionadas