Powershell'de GnuWin32 / sed beklenmedik davranış


0

Windows Komut Satırı / Powershell'de GnuWin32 araçlarını kullanıyorum .

Ne görüyorsun:

 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

Ne görmeyi umuyordum:

 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

Amacım , PowerShell tarafından eklenen veri sütunları arasındaki fazlalık boşluklardan kurtulmak. Komik olan, bu bir bilgisayarda (Win8.1 ile) mükemmel çalışıyor, ancak Win7 ile diğer bilgisayarlarda çalışmıyor.

Ve daha basit örnekler için çalışır:

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

Herhangi bir yardım çok takdir edilecektir.

FYI - Get-ChildItems'in normal çıktısı şöyle görünür:

 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

Neden sadece her şeyi powershell kullanmıyorsunuz? Nihai amaç nedir?
— EBGreen

Nihai hedef, cutve trve gibi gnuWin32 araçlarını kullanabilmektir sort. Bu benim tercih edilen yöntemim, çünkü Powershell sözdizimini gerçekten sevmiyorum Command | Select this and that | Format-table. Ayrıca powershell'de borudan geçen birçok şey bashta akarsu olan nesnelerdir - benim için manipülasyonu çok kolaydır.
— mnmnc

Bu ortamda bir kodlama sorunu olacak. Bunu engellemenin bir yolu, çıktıyı hangi kodlamanın işe yaradığını gösteren bir dosyaya koymak için Out-File kullanmak ve daha sonra dosyayı sed'e kadar okumak olacaktır.
— EBGreen

Yanıtlar:


2

Bu Unicode. Sed'den çıkan şeyler, PowerShell'in Unicode ve ASCII arasında ayrım yapmak için kullandığı 2 baytlık ön eki olmayan Unicode'dur. Böylece, PowerShell bunun ASCII olduğunu düşünüyor ve boşluk olarak görüntülenen \ 0 baytı (2 baytlık Unicode karakterlerden gelen üst bayt) bırakır. PowerShell dahili olarak Unicode ile ilgilendiğinden, aslında her bir baytı 2 baytlık bir Unicode karakterine genişletir. PowerShell'i Unicode'u kabul etmeye zorlamanın yolu yoktur. Çevresindeki olası yollar şunlardır:

  1. Unicode SED'e girdi olarak geliyor mu? Düşük bir ihtimal ama sanırım mümkün. Şunu kontrol et.

  2. SED'in çıktısını Unicode göstergeli \ uFEFF ile başlatınız. Muhtemelen SED kaynak kodunda kaçırılan şey:

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

    Kodu SED komutunun içine,

    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 dosyasının bir dosyaya yazıp Get-Content -Encoding Unicode ile okuyun. Dosyaya geçişin, cmd.exe içindeki komutta yapılması gerektiğine dikkat edin:

    cmd /c "sed ... >file"
    

    Dosyanın> PowerShell'de ele alınmasına izin verirseniz, aynı şekilde karışıklığa yol açar.

  4. Sonuç metindeki \ 0 karakterleri PowerShell'e bırakın. Bu, 0xA veya 0xD kodunu içeren Unicode baytlarını oluşturan uluslararası karakterlerle iyi çalışmaz - bunun yerine satır bölmeleriyle bitirdiniz.


Harika, zamanın ve analizin için çok teşekkür ederim. Şu an benim için çok daha net.
— mnmnc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.