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 도구를 사용할 수있게하는 것입니다. cut 과 tr 과 sort. 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.