क्या सीक का एक विकल्प है जो यूनिकोड का समर्थन करता है?


33

उदाहरण के लिए:

sed 's/\u0091//g' file1

अभी, मुझे hexdumpहेक्स संख्या प्राप्त करने के लिए और sedनिम्नानुसार करना होगा:

$ echo -ne '\u9991' | hexdump -C
00000000  e9 a6 91                                          |...|
00000003

और तब:

$ sed 's/\xe9\xa6\x91//g' file1

जवाबों:


28

बस उस वाक्य रचना का उपयोग करें:

sed 's/馑//g' file1

या बच गए रूप में:

sed "s/$(echo -ne '\u9991')//g" file1

(ध्यान दें कि बैश के पुराने संस्करण और कुछ गोले समझ में नहीं आते हैं echo -e '\u9991', इसलिए पहले जांच लें।)


1
क्या sed एक वर्ण या 3 के रूप में गिनता है? यही है, echo 馑 | sed s/...//कुछ भी प्रिंट करता है?
user253751

@ मिनीबिस चूंकि sedजी मॉडिफायर है, इसलिए यह सभी घटनाओं को तब भी प्रतिस्थापित करता है जब वे एक दूसरे का अनुसरण करते हैं। इसके अलावा sed को इसे एक चरित्र के रूप में गिनना चाहिए, देखें: echo -ne "馑" | wc -mदेता है 1। यदि आप बाइट्स ( wc -c) की गणना करते हैं तो यह वापस आ जाएगी 3। क्या मैं आपके प्रश्न को सही ढंग से समझ पाया हूं?
अराजकता

मेरा मतलब था: ."एक चरित्र" या "एक बाइट" का मतलब है?
user253751

@ मिनीबिस मैं एक चरित्र से मेल खाता है इसलिए echo 馑 | sed s/...//मुझे देता है (कुछ भी नहीं बदला गया है)
अराजकता

4
@ आचोस: यह काम करता है en_US.UTF-8, लेकिन इसके अंतर्गत नहीं है C
कोरोबा

15

पर्ल यह कर सकता है:

echo 汉典“馑”字的基本解释 | perl -CS -pe 's/\N{U+9991}/Jin/g'

-CS मानक इनपुट, आउटपुट और त्रुटि के लिए UTF-8 चालू करता है।


7
पर्ल लगभग कुछ भी कर सकता है .....
wobbily_col

6

sedसमर्थन यूनिकोड के कई संस्करण :

  • हिरलूम सेड , जो "मूल यूनिक्स सामग्री" पर आधारित है।
  • GNU sed , जो अपना स्वयं का कोडबेस है।
  • प्लान 9 सेड , जिसे यूनिक्स जैसे ऑपरेटिंग सिस्टम में पोर्ट किया गया है।

मुझे बीएसडी sed पर जानकारी नहीं मिली, जो मुझे लगा कि अजीब है, लेकिन मुझे लगता है कि ऑड्स अच्छे हैं कि यह यूनिकोड का भी समर्थन करता है। दुर्भाग्य से, यह बताने के लिए कोई मानक तरीका नहीं है कि sedकिस एन्कोडिंग का उपयोग किया जाए, इसलिए प्रत्येक व्यक्ति अपने तरीके से ऐसा करता है।


क्या वे BOM के साथ और उसके बिना UTF-16 का समर्थन करते हैं?
बॉन अमी

10
यूनिक्स-आधारित OSes में UTF-16 बहुत अनुपयोगी है। यह भी एक घृणा है जिसे कभी भी दिन की रोशनी नहीं देखनी चाहिए।
ब्रायन बीई

चाहे वे UTF-16 का समर्थन करें या नहीं, यह कार्यान्वयन पर निर्भर करता है, और मुझे डर है कि मेरे पास वह डेटा नहीं है। मुझे संदेह है कि प्लान 9 सेड करता है (मूल OS हर जगह UTF-8 है), लेकिन मुझे यकीन नहीं हो सकता है, और यहां तक ​​कि अगर यह नहीं होता है, तो बाकी लोग भी कर सकते हैं।
स्पूनिएस्ट

2

यह मेरे लिए काम करता है:

$ vim -nEs +'%s/\%u9991//g' +wq file1

यह एक बूंद अधिक क्रिया है जो मैं चाहूंगा; यहाँ एक पूर्ण विवरण है:

  • -n निष्क्रिय स्वैप फ़ाइल को निष्क्रिय करें
  • -E पूर्व सुधार मोड
  • -s शांत अवस्था
  • +'%s/\%u9991//g' प्रतिस्थापन कमांड निष्पादित करें
  • +wq सुरषित और बहार

मुझे लगता है कि यह file1 जगह में संशोधन करता है , क्या यह सही है?
गेरिट

@gerrit यह सही है, और इसे इंगित करने के लिए धन्यवाद।
आर्येह लीब तौआरोग

1

BASH के हाल के संस्करणों के साथ, बस sed अभिव्यक्ति के आसपास के उद्धरणों को छोड़ दें और आप BASH के बच गए तारों का उपयोग कर सकते हैं। बीएएस द्वारा वाइल्डकार्ड के रूप में व्याख्या की जाने वाली sed अभिव्यक्ति या sed अभिव्यक्ति के कुछ हिस्सों के भीतर रिक्त स्थान व्यक्तिगत रूप से उद्धृत किया जा सकता है।

$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻

यह नया स्वीकृत उत्तर होना चाहिए, सरल और साफ!
एलन वांग

0

मेरे लिए GNU sed के साथ काम करता है (संस्करण 4.2.1):

$ echo -ne $'\u9991' | sed 's/\xe9\xa6\x91//g' | hexdump -C
$ echo -ne $'\u9991' | hexdump -C
00000000  e9 a6 91

( sedआप के लिए एक और प्रतिस्थापन भी GNU का उपयोग कर सकता है awk; लेकिन यह आवश्यक नहीं लगता है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.