2013-02-15 61 views
5

पर अपेक्षित व्यवहार के रूप में व्यवहार नहीं कर रहा है मेरे प्रश्न का उत्तर SO पर मौजूद हो सकता है, लेकिन मैंने ईमानदारी से कड़ी मेहनत की है और इसे नहीं मिला। मुझे सबसे नज़दीकी मिला this Q&A था लेकिन मैं अपने मशीन (ओएसएक्स 10.7.5, bash का उपयोग करके) पर अपने परिणाम पुन: पेश नहीं कर सका।हेक्स कोड sed में - ओएसएक्स

यहाँ मुद्दा अपने सार करने के लिए कम है: मैं sed\xnn (जैसे \x41A के लिए) हेक्स पात्रों के रूप में व्याख्या करने के लिए नहीं मिल सकता है। क्या मुझे विशेष रूप से पागल गाड़ी चला रहा है यह है: A में

echo -e '\x41' 

परिणाम - तो ओएस और अपने कार्यों मेरी हेक्स कोड को समझने ...

echo -e '\x41' | sed 's/A/B/' 

परिणाम B में - के रूप में उम्मीद, हेक्स के बाद से कोड A में बदला गया था इससे पहले कि sed यह

लेकिन

echo A | sed 's/\x41/B/' 
देखा

परिणाम A में - मैं B

की उम्मीद है | मैं में A

echo A | LANG='' sed 's/\x41/B/' 

डिट्टो तरह

echo A | LANG='C' sed 's/\x41/B/' 

परिणाम चीजों की कोशिश की है ...

echo A | sed 's/[\x41]/B/' 

परिणामों में A

लेकिन ...

echo A | sed 's/[\x41-\x41]/B/' 

परिणाम B में ???

क्या मैं पूरी तरह बेवकूफ हूं? या sed के साथ वास्तव में कुछ अजीब है? यह स्पष्ट रूप से एक श्रेणी में हेक्स कोड की व्याख्या कर सकता है, लेकिन मुझे इसे एक वर्ण के रूप में व्याख्या नहीं किया जा सकता है। मैं क्या खो रहा हूँ?

कृपया ध्यान दें - मैं OSX पर जवाब है कि दोनों स्पष्टीकरण दें कि ऊपर जिस तरह से यह है बर्ताव कर रही है के लिए देख रहा हूँ, और के लिए यह संभव एक sed स्ट्रिंग में कहीं भी एक एकल हेक्स कोड सम्मिलित करने के लिए बनाने के तरीके, मंच। इसका अर्थ है "खोज", और s/ कमांड के "प्रतिस्थापित" भाग में। क्योंकि मैंने स्पष्ट रूप से दिखाया है कि मैं एक वर्ण के लिए [\ xnn- \ xnn] खोज सकता हूं; वह जवाब नहीं है जिसे मैं ढूंढ रहा हूं।

अग्रिम धन्यवाद!

उत्तर

8

"ओएस और उसके कार्यों को समझने" की कोई सामान्य अवधारणा नहीं है - प्रत्येक प्रोग्राम, फ़ंक्शन इत्यादि मेटाएक्टैक्टर्स, एस्केप इत्यादि के अपने विशेष सेट को समझता है और ऐसा होता है कि sed हेक्स नहीं करता है कोड।लेकिन बैश करता है (यदि आप इसे करने के लिए कह), ताकि आप इसे बुला sed$'' साथ पहले उन्हें अनुवाद कर सकते हैं: नोट

$ echo A | sed $'s/\x41/B/' 
B 

कि इससे उन्हें sed को पार करने से पहले अन्य भागने दृश्यों की व्याख्या, इसलिए यदि आप करना चाहते हैं sed के लिए किसी भी पलायन गुजरती हैं, तो आप उन्हें इस बात की दोबारा से बचने के लिए, या बोली मोड स्विच करने की जरूरत है ताकि केवल प्रासंगिक भाग $'' में है:

$ echo A | sed $'s/\\(\x41\\)/B\\1/' # double-escapes for sed's escape sequences 
BA 
$ echo A | sed 's/\('$'\x41''\)/B\1/' # equivalent with different quote modes 
BA 
$ echo A | sed 's/\(A\)/B\1/' # simplest equivalent version 
BA 

और एक हेक्स लगातार की तुलना में एक चर में निकल जाता है, बल्कि अगर आप की व्याख्या करना चाहते हैं , स्ट्रिंग, तो आपको बहुत ज्यादा उपयोग करना होगा नरक के printf निर्मित:

$ hex=41 
$ echo A | sed "s/$(printf "\x$hex")/B/" 
B 
+0

इसके लिए धन्यवाद। यदि "sed हेक्स कोड नहीं करता है", तो आप मेरे आखिरी उदाहरण को कैसे समझाते हैं- यह * दिखता है * जैसे कि रेड अभिव्यक्ति में हेक्स समझ रहा है ... – Floris

+0

"आप मेरे आखिरी उदाहरण को कैसे समझाते हैं" - मैंने स्वयं में समझाया उत्तर, नीचे ... – Floris

+0

sed अभिव्यक्ति (दूसरे भाग) के विकल्प भाग में हेक्स एन्कोडिंग का उपयोग करने के तरीके पर कोई विस्तार? मैंने कोशिश की: 'echo -ne' एक \ x0db '| sed $/s/\ x0d/\ x0a/g '| हेक्सडम्प-सी' और 'echo -ne' एक \ x0db '| sed $/s/\ x0d/\\ x0a/g '| हेक्सडम्प-सी 'का कोई फायदा नहीं हुआ। अन्यथा, यह वही था जो मैं ढूंढने की उम्मीद कर रहा था। – mpettis

3

@GordonDavisson मुझे दो और बातें करने की कोशिश करना प्रेरणा दिया ...

सबसे पहले - मैं अचानक अगर मैं

echo A | sed 's/[\x41-\x41]/B/' 

के उत्पादन में बदल गया था मैं मान लिया सोचा इसका मतलब है कि sed एक श्रेणी में \xnn कोड समझा, लेकिन मैं गलत था। जब मैं

echo A | sed 's/[\x40-\x40]/B/' 

की कोशिश की मैं अभी भी, B का उत्पादन हो गया है, हालांकि मैंने सोचा कि मैं किसी भी अधिक रेंज में भी शामिल नहीं किया गया था A (\x41)। जाहिर है, sed मेरी सीमा को मेरी अपेक्षा से किसी अन्य तरीके से व्याख्या कर रहा था। यह man re_format पृष्ठ को अधिक ध्यान से देखकर हल किया गया था। इसमें कहा गया है

[...] `\ 'सहित अन्य सभी विशेष वर्ण, एक ब्रैकेट अभिव्यक्ति के भीतर अपने विशेष महत्व खो देते हैं।

लेकिन तब मुझे मिल प्रेरणा: echo -e स्ट्रिंग का विस्तार कर सकते हैं, शायद मैं इसका इस्तेमाल स्ट्रिंग मैं sed करना चाहते हैं को खिलाने के लिए कर सकते हैं ...

echo "This?" | sed `echo -e 's/\x54\x68\x69\x73\x3F/\x59\x65\x73\x21/'` 

उत्पादन Yes!

echo "That?" | sed `echo -e 's/\x54\x68\x69\x73\x3F/\x59\x65\x73\x21/'` 

That?

इस मामले में बेशक \xnn वर्ण केवल सादा ASCII का प्रतिनिधित्व करते हैं - स्ट्रिंग को डीकोडिंग केवल 's/This?/Yes!/' देता है, लेकिन यह sed के लिए स्ट्रिंग में हेक्स वर्ण डालने का सिद्धांत स्थापित करता है। एकमात्र चीज यह स्पष्ट करने में मदद नहीं करती है "क्या होता है यदि आपका गूंज स्टेटमेंट उन वर्णों को प्रिंट करता है जिन्हें sed में भागने की आवश्यकता होगी। और यह अभी भी मेरे मौलिक प्रश्न को संबोधित नहीं करता है -" मैं हेक्स वर्णों को सीधे कैसे जोड़ूं sed स्ट्रिंग। मुझे अभी भी संदेह है कि यह संभव है ... sed पर प्रलेखन पढ़ने के बाद भी (जो "पुराने" नियमित अभिव्यक्तियों का उपयोग करने का दावा करता है, हालांकि -ई ध्वज इसे "विस्तारित" अभिव्यक्तियों का उपयोग कर सकता है, और उपयोगकर्ता को re_format पर निर्देशित करता है विवरण के लिए मैन पेज; और re_syntax पृष्ठ, जिसे re_format द्वारा संदर्भित किया गया है। इनके बीच, यह वास्तव में एक हेक्स स्ट्रिंग जोड़ने जैसा दिखता है सीधे काम करना चाहिए ...

मैंने इस प्रश्न को मेरे प्रश्न के "संपादन" के बजाय "उत्तर" के रूप में जोड़ा, क्योंकि मुझे लगता है कि यह मेरे प्रश्न का उत्तर देने के लिए से शुरू होता है ... टिप्पणियों की प्रतीक्षा कर रहे हैं!