2012-03-13 3 views
9

मैं एक बहुत ही सरल एसईडी स्क्रिप्ट टिप्पणियों को निकालने का उपयोग कर रहा हूँ। यह लाइन नियमित अभिव्यक्ति से मेल नहीं खाती है और प्रतिस्थापित नहीं होती है।

किसी भी विचार को वास्तव में किसी भी चरित्र से मेल खाने के लिए . कैसे प्राप्त करें?


समाधान:

के बाद से file कहना है कि वह एक iso8859 पाठ है, LANG चर वातावरण sed कॉल करने से पहले परिवर्तित किया जाना चाहिए: LANG=iso8859 sed -e 's/--.*//' -

उत्तर

2

@ जूलियो-गुएरा: मैं एक ऐसी ही स्थिति में भाग गया, folowing (ध्यान दें Æ चरित्र) की तरह लाइनों को हटाने का प्रयास :

--MP_/yZa.b._zhqt9OhfqzaÆC

एक फ़ाइल में, का उपयोग कर

sed 's/^--MP_.*$//g' my_file

फ़ाइल लिनक्स file आदेश ने संकेत दिया एन्कोडिंग

file my_file: ISO-8859 text, with very long lines 
file -b my_file: ISO-8859 text, with very long lines 
file -bi my_file: text/plain; charset=iso-8859-1 

मैं अपने समाधान, विभिन्न क्रमपरिवर्तन के साथ की कोशिश की थी (चालाक!); उदाहरण के लिए,

LANG=ISO-8859 sed 's/^--MP_.*$//g' my_file

लेकिन उन में से कोई भी काम किया। मुझे दो वर्कअराउंड मिले:

  1. निम्नलिखित Perl अभिव्यक्ति ने काम किया, यानी।[, -pe कमांड लाइन स्विच की एक विवरण के लिए यह StackOverflow जवाब का संदर्भ लें:

    Perl flags -pe, -pi, -p, -w, -d, -i, -t?]

perl -pe 's/^--MP_.*$//g' my_file

: कि रेखा को हटा

  1. वैकल्पिक रूप से, फ़ाइल एन्कोडिंग को यूटीएफ -8 में परिवर्तित करने के बाद, sed अभिव्यक्ति काम करती है (Æ वर्ण बना रहा, लेकिन अब यूटीएफ 8-एन्कोडेड था):

iconv -f iso-8859-1 -t utf8 my_file > my_file.utf8

मैं विभिन्न एन्कोडिंग के साथ ईमेल के बहुत सारे (1000 के), कि (UTF-8 के लिए बैश-पटकथा रूपांतरण हमेशा काम नहीं करते हैं) मध्यवर्ती प्रसंस्करण से गुजरना, मेरे प्रयोजनों "समाधान 1 के लिए साथ काम कर रहा हूँ के रूप में "उपरोक्त शायद सबसे मजबूत समाधान होगा।

नोट्स:

  • sed (जीएनयू sed) 4.4
  • पर्ल v5.26.1 के लिए x86_64-linux-धागे की बहु
  • आर्क लिनक्स x86_64 प्रणाली
0

के प्रलेखन का निर्माण जीएनयू sed's z कमांड इस प्रभाव का उल्लेख करता है (मेरा जोर):

यह आदेश पैटर्न स्थान की सामग्री खाली करता है। यह आमतौर पर 's /.////' जैसा ही है, लेकिन यह अधिक कुशल है और अमान्य मल्टीबाइट अनुक्रम इनपुट स्ट्रीम में मौजूद है। POSIX अनिवार्य है कि ऐसे अनुक्रम 'से मेल खाते हैं।, ताकि के बीच में अधिकांश मल्टीबाइट लोकेशंस (यूटीएफ -8 लोकेशंस सहित) में स्क्रिप्ट के बफर को साफ़ करने का कोई पोर्टेबल तरीका नहीं है।

ऐसा लगता है कि आप एक यूटीएफ -8 (या अन्य मल्टीबाइट) लोकेल में दौड़ रहे हैं। आप LC_CTYPE सेट करना चाहते हैं (यह LANG से बेहतर है, और त्रुटि संदेशों के अनुवाद को प्रभावित नहीं करेगा। मान्य लोकेल नाम आमतौर पर en.iso88591 या (आपकी प्रोफ़ाइल में स्थान के लिए) fr_FR.iso88591 जैसा दिखता है, न केवल अपने आप पर एन्कोडिंग - आप locale -a साथ पूरी सूची देखने के सक्षम हो सकता है

उदाहरण:

LC_CTYPE=fr_FR.iso88591 sed -e 's/--.*//' 

वैकल्पिक रूप से, अगर आप जानते हैं कि लाइन के गैर टिप्पणी भागों केवल ASCII होते हैं, आप विभाजित कर सकते हैं। एक टिप्पणी मार्कर पर लाइन, पहले भाग को मुद्रित करें और शेष को छोड़ दें:

sed -e 's/--/\n/' -e 'P' -e 'd' 
संबंधित मुद्दे