Powershell에서 GnuWin32 / sed 예기치 않은 동작


0

나는 사용하고있다. GnuWin32 Windows 명령 행 / Powershell .

무엇을 볼 수 있습니다 :

 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

내가 예상했던 것 :

 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

내 목표 PowerShell에 의해 추가 된 데이터 열 사이에 여분의 공백을 제거하는 것입니다. 재밌는 점은 한 대의 컴퓨터 (Win8.1)에서 완벽하게 작동하지만 Win7이 설치된 다른 컴퓨터에서는 작동하지 않습니다.

그리고 그것은 더 간단한 예제를 위해 작동합니다 :

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

어떤 도움을 많이 주시면 감사하겠습니다.

참고 - Get-ChildItems의 일반적인 출력 다음과 같이 보입니다.

 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

왜 모든 것을 위해 파워 쉘을 사용하지 않는가? 궁극적 인 목표는 무엇입니까?
EBGreen

궁극적 인 목표는 다음과 같은 gnuWin32 도구를 사용할 수있게하는 것입니다. cuttrsort. PowerShell 구문이 마음에 들지 않으므로 선호하는 방식입니다. Command | Select this and that | Format-table. 또한 Powershell에서는 파이프를 통과하는 많은 것들이 스트림에서 배쉬 (bash)로 흐르는 객체입니다. 이것은 나를 위해 조작하기가 훨씬 쉽습니다.
mnmnc

그것은 환경에서 인코딩 문제가 될 것입니다. 그것을 피하는 한 가지 방법은 Out-File을 사용하여 어떤 인코딩 작업이든 파일에 출력을 넣은 다음 파일을 sed로 다시 읽는 것입니다.
EBGreen

답변:


2

그것은 유니 코드입니다. sed에서 나오는 내용은 PowerShell이 ​​유니 코드와 ASCII를 구별하기 위해 사용하는 2 바이트 접두사가없는 유니 코드입니다. 따라서 PowerShell은 ASCII라고 생각하고 공백으로 표시되는 \ 0 바이트 (2 바이트 유니 코드 문자의 상위 바이트)를 남겨 둡니다. PowerShell은 내부적으로 유니 코드를 처리하기 때문에 원래의 모든 바이트를 2 바이트 유니 코드 문자로 확장합니다. PowerShell이 ​​유니 코드를 받아들이도록 강요 할 수는 없습니다. 가능한 방법은 다음과 같습니다.

  1. 유니 코드가 SED에 입력으로 제공됩니까? 있을 법하지는 않지만 가능한 것으로 생각합니다. 그것을 확인하십시오.

  2. SED의 출력을 유니 코드 표시기 \ uFEFF로 시작하십시오. 이것은 아마도 SED 소스 코드에서 놓친 것입니다 :

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

    SED 명령 안에 코드를 추가 할 수 있습니다.

    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. sed의 출력을 파일에 쓴 다음 Get-Content -Encoding Unicode를 사용하여 읽습니다. 파일로의 전환은 다음과 같이 cmd.exe 내의 명령으로 수행되어야합니다.

    cmd /c "sed ... >file"
    

    PowerShell에서 & gt; 파일을 처리하도록 설정하면 동일한 방식으로 엉망이됩니다.

  4. PowerShell에서 결과 텍스트의 \ 0 문자를 삭제하십시오. 이 코드는 0xA 또는 0xD 코드가 포함 된 유니 코드 바이트를 만드는 국제 문자로는 잘 작동하지 않습니다. 대신에 줄이 그 대신에 나뉘어집니다.


대단히 감사합니다. 시간과 분석에 감사드립니다. 지금 당장은 나에게 훨씬 명확 해.
mnmnc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.