पावेलशेल में GnuWin32 / sed अप्रत्याशित व्यवहार


0

मै इस्तेमाल कर रहा हूँ GnuWin32 विंडोज कमांड लाइन पर उपकरण / शक्ति कोशिका

क्या है:

 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

किसी भी प्रकार के मदद की बहुत सराहना की जाएगी।

FYI करें - 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। यह मेरा पसंदीदा तरीका है क्योंकि मुझे वास्तव में इसके लिए पॉवर्सशेल सिंटैक्स पसंद नहीं है Command | Select this and that | Format-table। इसके अलावा, बहुत सी चीजों को पाइप के माध्यम से पारित किया जाता है, ऐसी वस्तुएं होती हैं, जहां पर वे उन धाराओं में होती हैं - जो मेरे लिए हेरफेर करना बहुत आसान है।
mnmnc

यह पर्यावरण में एक एन्कोडिंग मुद्दा बनने जा रहा है। इससे बचने का एक तरीका यह होगा कि जो भी एन्कोडिंग काम करता है, उसके साथ आउट-फाइल को फाइल में डालने के लिए आउट-फाइल का उपयोग किया जाए।
EBGreen

जवाबों:


2

यह यूनिकोड है। सीड से निकलने वाला सामान 2-बाइट उपसर्ग के बिना यूनिकोड है जो पावरशेल यूनिकोड और एएससीआईआई के बीच अंतर करने के लिए उपयोग करता है। तो PowerShell को लगता है कि यह ASCII है और \ 0 बाइट्स (2-बाइट यूनिकोड वर्णों से ऊपरी बाइट्स) को छोड़ देता है, जो रिक्त स्थान के रूप में प्रदर्शित होता है। और चूंकि यूनीकोड ​​में आंतरिक रूप से पॉवरशेल डील होती है, यह वास्तव में हर मूल बाइट को 2-बाइट यूनिकोड चरित्र में विस्तारित करता है। PowerShell को यूनिकोड स्वीकार करने के लिए बाध्य करने का कोई तरीका नहीं है। इसके आस-पास के संभावित तरीके हैं:

  1. क्या यूनिकोड एसईडी में इनपुट के रूप में आ रहा है? बेवजह लेकिन मुझे लगता है कि संभव है। जांच करे।

  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"
    

    यदि आप बस & gt; फ़ाइल को PowerShell में नियंत्रित करते हैं, तो इसे उसी तरह गड़बड़ किया जाएगा।

  4. PowerShell में परिणामी पाठ से \ 0 वर्ण ड्रॉप करें। यह अंतर्राष्ट्रीय वर्णों के साथ अच्छी तरह से काम नहीं करता है जो कोड 0xA या 0xD युक्त यूनिकोड बाइट्स बनाते हैं - आप उनके बजाय लाइन विभाजन के साथ समाप्त होते हैं।


महान, आपके समय और विश्लेषण के लिए बहुत बहुत धन्यवाद। यह अभी मेरे लिए बहुत स्पष्ट है।
mnmnc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.