Saya menggunakan alat GnuWin32 pada Windows Command Line / Powershell .
Apa yang dilihat:
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
Apa yang saya harapkan:
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
Tujuan saya adalah untuk menghilangkan ruang yang tidak perlu di antara kolom data, yang ditambahkan oleh PowerShell. Lucunya ini berfungsi dengan baik di satu komputer (dengan Win8.1), tetapi tidak bekerja di komputer lain dengan Win7.
Dan itu berfungsi untuk contoh yang lebih sederhana:
11:49 enlil D:\Users\x> echo "t a t" | sed "s/ */ /g"
t a t
Bantuan apa pun akan sangat dihargai.
FYI - Output normal Get-ChildItems terlihat seperti ini:
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
windows-7
powershell
sed
gnuwin32
mnmnc
sumber
sumber
cut
dantr
dansort
. Ini cara yang saya sukai karena saya tidak terlalu menyukai sintaks PowershellCommand | Select this and that | Format-table
. Juga dalam powershell banyak hal yang dilewati pipa adalah benda-benda di mana di bash mereka adalah aliran - yang jauh lebih mudah untuk dimanipulasi untuk saya.Jawaban:
Itu Unicode. Barang yang keluar dari sed adalah Unicode tanpa awalan 2-byte yang digunakan PowerShell untuk membedakan antara Unicode dan ASCII. Jadi PowerShell berpikir bahwa itu adalah ASCII dan membiarkan \ 0 byte (byte atas dari karakter Unicode 2-byte), yang ditampilkan sebagai kosong. Dan karena secara internal transaksi PowerShell di Unicode, itu sebenarnya memperluas setiap byte asli menjadi karakter Unicode 2-byte. Tidak ada cara untuk memaksa PowerShell agar menerima Unicode. Cara yang mungkin untuk mengatasinya adalah:
Apakah Unicode datang sebagai input ke SED? Tidak mungkin tapi saya pikir mungkin. Periksa itu.
Buat output SED mulai dengan indikator Unicode, \ uFEFF. Ini mungkin yang terlewatkan dalam kode sumber SED:
Anda dapat menambahkan kode di dalam perintah SED, sesuatu seperti
Tulis output dari sed ke dalam file dan kemudian baca dengan Get-Content -Encoding Unicode. Perhatikan bahwa beralih ke file harus dilakukan dalam perintah di dalam cmd.exe, seperti:
Jika Anda hanya membiarkan file ditangani di PowerShell, file itu akan dikacaukan dengan cara yang sama.
Jatuhkan \ 0 karakter dari teks yang dihasilkan di PowerShell. Ini tidak bekerja dengan baik dengan karakter internasional yang membuat byte Unicode yang berisi kode 0xA atau 0xD - Anda berakhir dengan pemisahan garis alih-alih mereka.
sumber