जाहिर है, @ टीएमएस आरटीएफएम नहीं कर सकता है। आप यह करते हैं और रिक्त स्थान की जरूरत को निकालना चाहते हैं (अपने पिछले जवाब देने के लिए अपनी टिप्पणी देखें)
:
echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'
पहले दो पाइप लाइन में आदेशों में अच्छी तरह से अपने जवाब में @TMS से समझाया जाता है, @ जेम्स द्वारा संपादित के रूप में। अंतिम आदेश @ टीएमएस टिप्पणी से अलग है कि यह दोनों सही है और परीक्षण किया गया है। स्पष्टीकरण है:
sed
एक रों tream एड itor है।
s
s ubstitute कमांड है।
/
एक नियमित अभिव्यक्ति खुलता है - किसी भी चरित्र का उपयोग किया जा सकता है। /
परंपरागत है, लेकिन प्रसंस्करण, कहने, एक्सएमएल या पथ नाम के लिए असुविधाजनक है।
/
या आपके द्वारा चुने गए वैकल्पिक चरित्र, नियमित अभिव्यक्ति को बंद कर देते हैं और प्रतिस्थापन स्ट्रिंग खोलता है।
/ */
*
पिछले वर्ण के किसी अनुक्रम से मेल खाता है (इस मामले में, एक स्थान)।
/
या आपके द्वारा चुने गए वैकल्पिक चरित्र, प्रतिस्थापन स्ट्रिंग को बंद कर देता है। इस मामले में, प्रतिस्थापन स्ट्रिंग //
खाली है, यानी मैच हटा दिया गया है।
g
इस प्रतिस्थापन जी प्रत्येक लाइन पर प्रत्येक पंक्ति के लिए के बजाय प्रत्येक पंक्ति पर लॉबली करने का विकल्प है।
- उद्धरण पार्सर को भ्रमित होने से रोकते हैं - पूरे अनुक्रम
sed
को पहले विकल्प के रूप में पास किया जाता है, अर्थात् sed
स्क्रिप्ट।
@TMS मस्तिष्क बच्चे (sed 's/^ *//'
) केवल प्रत्येक पंक्ति की शुरुआत से रिक्त स्थान स्ट्रिप्स (^
पंक्ति के आरंभ से मेल खाता है - sed
-speak में 'पैटर्न अंतरिक्ष')।
आप अतिरिक्त नई-पंक्तियों को निकालना चाहते हैं, सबसे आसान तरीका है संलग्न करने के लिए
| tr -d '\n'
आदेश पाइप
है। यह निम्नानुसार कार्य करता है:
|
इस कमांड के मानक इनपुट में पहले संसाधित स्ट्रीम को फ़ीड करता है।
tr
tr anslate कमांड है।
-d
मिलान वर्णों को हटाने का निर्दिष्ट करता है।
- उद्धरण आपके मिलान वर्णों की सूची - इस मामले में केवल नई लाइन (
\n
)। अनुवाद केवल एकल अक्षरों से मेल खाता है, अनुक्रम नहीं।
sed
न्यूलाइन से निपटने के दौरान विशिष्ट रूप से मंद हो जाता है। ऐसा इसलिए है क्योंकि sed
सबसे पुराने unix
कमांडों में से एक है - यह लोगों को वास्तव में पता था कि वे क्या कर रहे थे इससे पहले बनाया गया था। व्यापक विरासत सॉफ्टवेयर इसे ठीक होने से रोकता है। मुझे यह पता है क्योंकि मेरा जन्म unix
से पहले हुआ था।
समस्या की ऐतिहासिक उत्पत्ति यह विचार थी कि एक नई लाइन रेखा रेखा का हिस्सा नहीं है, रेखा का हिस्सा नहीं है। इसलिए इसे लाइन प्रोसेसिंग यूटिलिटीज द्वारा अलग किया गया था और आउटपुट यूटिलिटीज द्वारा पुन: सम्मिलित किया गया था। समस्या यह है कि यह उपयोगकर्ता डेटा की संरचना के बारे में धारणा बनाता है और कई सेटिंग्स में अप्राकृतिक प्रतिबंध लगाता है। sed
की आसानी से न्यूलाइन को हटाने में असमर्थता उस विकृत विचारधारा के सबसे आम उदाहरणों में से एक है जो दुःख का कारण बनती है।
यह sed
साथ नई-पंक्तियों को दूर करने के लिए संभव है - यह है कि अभी सब समाधान के बारे में मैं sed
प्रक्रिया पूरी फ़ाइल एक ही बार में, जो बहुत बड़ी फ़ाइलों के लिए chokes बनाने पता, एक धारा संपादक के प्रयोजन को पराजित किया। कोई भी समाधान जो लाइन प्रोसेसिंग को बरकरार रखता है, यदि यह संभव हो, तो कई पाइपों का एक अपठनीय चूहे का घोंसला होगा।
आप sed
कोशिश का उपयोग कर पर जोर देते हैं:
sed -z 's/\n//g'
-z
sed
बताता लाइन विभाजक के रूप में उपयोग करने के लिए nulls।
आंतरिक रूप से, C
में एक स्ट्रिंग को शून्य के साथ समाप्त कर दिया गया है। -z
विकल्प विरासत का भी परिणाम है, C
प्रोग्रामर की सुविधा के रूप में प्रदान किया गया है जो C
-strings से भरे अस्थायी फ़ाइल का उपयोग करना चाहेंगे और न्यूलाइन द्वारा अनचाहे।फिर वे एक समय में एक स्ट्रिंग को आसानी से पढ़ और संसाधित कर सकते हैं। फिर, उपयोग मामलों के बारे में प्रारंभिक धारणा उपयोगकर्ता डेटा पर कृत्रिम प्रतिबंध लगाती है।
यदि आप g
विकल्प को छोड़ देते हैं, तो यह आदेश केवल पहली नई पंक्ति को हटा देता है। -z
विकल्प sed
पूरी फ़ाइल को एक पंक्ति के रूप में व्याख्या करता है (जब तक कि फ़ाइल में एम्बेडेड भटकने वाले नल होते हैं), जिसे शून्य से समाप्त किया जाता है और इसलिए यह बड़ी फ़ाइलों पर भी चोक करता है।
आप सोच सकते हैं
sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'
काम हो सकता है। पहला आदेश पंक्ति के आधार पर प्रत्येक पंक्ति के सामने एक नल डालता है, जिसके परिणामस्वरूप \n\x00
प्रत्येक पंक्ति को समाप्त करता है। दूसरा आदेश प्रत्येक पंक्ति से एक नई लाइन को हटा देता है, जो अब नल द्वारा सीमित है - पहले कमांड के आधार पर केवल एक नई लाइन होगी। जो कुछ बचा है वह नकली नल हैं। अब तक सब ठीक है। यहां टूटा हुआ विचार यह है कि पाइप लाइन के आधार पर लाइन पर अंतिम कमांड को खिलाएगी, क्योंकि इस तरह स्ट्रीम बनाया गया था। दरअसल, आखिरी कमांड, लिखित के रूप में, केवल एक शून्य को हटा देगा क्योंकि अब पूरी फाइल में कोई नई लाइन नहीं है और इसलिए एक पंक्ति है।
सरल पाइप कार्यान्वयन एक मध्यवर्ती अस्थायी फ़ाइल का उपयोग करता है और सभी इनपुट संसाधित और फ़ाइल में खिलाया जाता है। अगला आदेश किसी अन्य धागे में चल रहा है, समवर्ती रूप से उस फ़ाइल को पढ़ रहा है, लेकिन यह पूरी तरह से स्ट्रीम को पूरी तरह से देखता है (हालांकि अधूरा) और फ़ाइल को खाने वाली चंक सीमाओं के बारे में कोई जागरूकता नहीं है। यहां तक कि यदि पाइप मेमोरी बफर है, तो अगला कमांड स्ट्रीम को पूरी तरह से देखता है। दोष को sed
में बेक किया गया है।
इस दृष्टिकोण को काम करने के लिए, आपको अंतिम आदेश पर g
विकल्प की आवश्यकता है, इसलिए, यह बड़ी फ़ाइलों पर चोक करता है।
नीचे की रेखा यह है: न्यूलाइन को संसाधित करने के लिए sed
का उपयोग न करें।
क्या ऑपरेटिंग सिस्टम? बहुत सी "कमांड लाइनें" हैं ... – Nemo
क्या आपने यहां देखा है: http://www.commandlinefu.com/commands/view/6066/convert-ascii-string-to-hex और यहां: http: // stackoverflow.com/questions/2103698/dos-command-to-format-string-to-hex-value? – Mrchief
@ नीमो मैं उबंटू लिनक्स पर हूं ... – Eamorr