समस्या यह है कि 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
sedयूनिकोड का समर्थन करता है ... यह आप क्या करने की कोशिश कर रहे हैं? (की पूरी सामग्री को शामिल करेंprocess.sed)