फ़ाइल प्रारूप को बदलने वाले सेड से कैसे बचें?


0

मैं एक फ़ाइल को प्रीप्रोसेस करने के लिए एक सेड फाइल का उपयोग करने की कोशिश कर रहा था, लेकिन सीड से आउटपुट फॉर्मेट को बदलने लगता है। मुझे इससे कैसे बचना चाहिए?

file A.txt
A.txt UTF-8 Unicode English text, with very long lines

sed -f process.sed < A.txt > B.txt

head -2 process.sed
#!/bin/sed -f
s/[‘’"“”•·・、。《》™®\.★☆]\\[a-z\-]\+ //g

file B.txt
Non-ISO extended-ASCII English text, with very long lines, with LF, NEL line terminators

क्योंकि B.txt UTF-8 एनकोडेड नहीं है, इसलिए मैं निम्नलिखित प्रसंस्करण नहीं कर सकता।

vim B.txt
è·¯æ<98><93>æ<96>¯ Âç½<97>å¾·é<87><8c>æ ¼æ<96>¯ //è·¯æ<98><93>æ<96>¯Â·ç½<97>å¾·é<87><8c>æ ¼æ<96>¯ ]

मुझे नहीं लगता कि sed यूनिकोड का समर्थन करता है ... यह आप क्या करने की कोशिश कर रहे हैं? (की पूरी सामग्री को शामिल करें process.sed)
Attie

1
आपके LC_ALL/ LANG/ LANGUAGEपर्यावरण चर किसके लिए निर्धारित हैं?
Attie

@Attie मैं टैग के साथ सभी चीनी विराम चिह्न को हटाने की कोशिश कर रहा हूं।
लुका

@ 'जैसे' 'यह एक tt / डनहाओ पिंक है "->" यह एक पीक है "। लेकिन केवल टैग के साथ विराम चिह्न हटा दें
लुका

जवाबों:


1

समस्या यह है कि sed का regexp इंजन आपकी इनपुट फ़ाइल नहीं देखता है और न ही आपका […]मेल यूनिकोड वर्णों की सूची के रूप में है; इसके बजाय यह उनमें से प्रत्येक को कई स्वतंत्र बाइट्स के रूप में देखता है। उदाहरण के लिए, यह तीन बाइट्स के रूप में देखता है \xe2 \x80 \xa2और उनमें से प्रत्येक के खिलाफ व्यक्तिगत रूप से मिलान करने की कोशिश करता है [ \xe2 \x80 \x98 \xe2 \x80 \x99 \x22 \xe2 \x80 ... ]

इसलिए आपके द्वारा पोस्ट में दिखाए गए उदाहरण में, रेगेक्स केवल मेल खाता है और प्रत्येक विराम चिह्न के अंतिम बाइट को हटाता है, लेकिन अन्य 2 को अभी भी वहीं छोड़ देता है। यही आपको एक अमान्य (गैर-UTF-8) आउटपुट फ़ाइल देता है।

GNU sed (4.5 पर परीक्षण) के साथ, यह सुनिश्चित करके बचा जा सकता है कि सिस्टम लोकेल ($ LANG या कम से कम $ LC_CTYPE पर्यावरण चर) UTF-8 संगत लोकेल पर सेट है। उदाहरण के लिए:

$ निर्यात LANG = 'C'
$ गूंज '' परीक्षण '' परीक्षण '' | sed 's / ["" •] / X / g'
XXtestXX  XXXtestXXX
$ गूंज '• _test' | sed 's / [• ‡] _ / X_ /'
X_test

$ निर्यात LANG = 'en_US.UTF-8'
$ गूंज '' परीक्षण '' परीक्षण '' | sed 's / ["" •] / X / g'
'परीक्षण' XtestX
$ गूंज '• _test' | sed 's / [• ‡] _ / X_ /'
X_test

(स्थानीय भाषा कोई मायने नहीं रखती। कोई भी UTF-8 लोकेल काम करेगा।)

यदि यह आपके लिए काम नहीं करता है, तो […]पूरी तरह से बचें और उपयोग करें \(…\|…\|…\)(या (…|…|…)sed -r में), जो एक बहु-वर्ण विकल्प है और यह परवाह किए बिना काम करेगा कि उन वर्णों की व्याख्या कैसे की जा रही है।

$ निर्यात LANG = 'C'
$ गूंज '' परीक्षण '' परीक्षण '' | sed का / / ("\ |" \ | • \) / X / g '
'परीक्षण' XtestX
$ गूंज '• _test' | sed 's / \ ((\ _ | s \) _ / X_ /'
X_test
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.