समस्या यह है कि 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
)