GnuWin32 / sed comportamento inesperado no Powershell

GnuWin32 / sed comportamento inesperado no Powershell

estou usandoGnuWin32ferramentas na linha de comando do Windows/Powershell.

O que é ver:

 11:15 enlil D:\Users\x> Get-ChildItem .gitconfig  | sed "s/ */ /g"


 D i r e c t o r y : D : \ U s e r s \ x


 M o d e L a s t W r i t e T i m e L e n g t h N a m e
 - - - - - - - - - - - - - - - - - - - - - - - - - - -
 - a - - - 6 / 2 3 / 2 0 1 4 4 : 1 1 P M 5 6 . g i t c o n f i g

O que eu esperava ver:

 11:15 enlil D:\Users\x> ls .gitconfig  | sed "s/ */ /g"


 Directory: D:\Users\x


 Mode LastWriteTime Length Name
 ---- ------------- ------ ----
 -a--- 6/23/2014 4:11 PM 56 .gitconfig

O meu objectivoé eliminar espaços redundantes entre colunas de dados, que são adicionados pelo PowerShell. O engraçado é que isso funciona perfeitamente em um computador (com Win8.1), mas não funciona em outro computador com Win7.

E funciona para exemplos mais simples:

 11:49 enlil D:\Users\x> echo "t  a t" |  sed "s/ */ /g"
 t a t

Qualquer ajuda será muito apreciada.

PARA SUA INFORMAÇÃO -Saída normal de Get-ChildItemsse parece com isso:

 11:22 enlil D:\Users\x> ls .gitconfig


    Directory: D:\Users\x


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         6/23/2014   4:11 PM         56 .gitconfig

Responder1

É o Unicode. O material que sai do sed é Unicode sem o prefixo de 2 bytes que o PowerShell usa para diferenciar entre Unicode e ASCII. Portanto, o PowerShell pensa que é ASCII e deixa os \0 bytes (os bytes superiores dos caracteres Unicode de 2 bytes), que são exibidos como espaços em branco. E como o PowerShell lida internamente com Unicode, ele expande cada byte original em um caractere Unicode de 2 bytes. Não há como forçar o PowerShell a aceitar o Unicode. As possíveis maneiras de contornar isso são:

  1. O Unicode está entrando como entrada no SED? Improvável, mas acho possível. Verifique isso.

  2. Faça a saída do SED começar com o indicador Unicode, \uFEFF. Provavelmente foi isso que faltou no código-fonte do SED:

    _setmode(_fileno(stdout), _O_WTEXT); // probably present and makes it send Unicode
    wprintf(L"\uFEFF"); // probably missing
    

    Você pode adicionar o código dentro do comando SED, algo como

    sed "1s/^/\xFF\xFE/;..." # won't work if SED produces Unicode but would work it SED passes Unicode through from its input
    sed "1s/^/\uFEFF/;..." # use if SED produces Unicode itself, hopefully SED supports \u
    
  3. Escreva a saída de sed em um arquivo e depois leia com Get-Content -Encoding Unicode. Observe que a mudança para arquivo deve ser feita no comando dentro do cmd.exe, como:

    cmd /c "sed ... >file"
    

    Se você deixar >file ser manipulado no PowerShell, ele ficará confuso da mesma maneira.

  4. Elimine os caracteres \0 do texto resultante no PowerShell. Isso não funciona bem com os caracteres internacionais que criam os bytes Unicode contendo o código 0xA ou 0xD - você acaba com as divisões de linha em vez deles.

informação relacionada