डुप्लिकेट वर्णों को कैसे निकालें?


18

अगर मैं एक लाइन के रूप में कर रहा हूँ:

Thhiisss iisss mmyyy nameeee

मैं इसे प्रिंट करना चाहता हूं:

This is my name

इसके लिए यूनिक्स कमांड क्या है?


क्या आप दोहराव और वांछित आउटपुट की उत्पत्ति पर कुछ और संदर्भ प्रदान कर सकते हैं? क्या होगा अगर "Myyy nameee iisss Jesssssiiieee"?
पाउलो अल्मीडा

जवाबों:


24

के साथ tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'a-z'

स्पष्टीकरण: "निचोड़" का -sस्विच trदोहराए गए वर्ण हैं। जैसा कि दिखाया गया है, स्विच का उपयोग वर्णों की श्रेणी के साथ किया जा सकता है: aसे z


2
कमांड के लिए कुछ स्पष्टीकरण भविष्य के पाठकों के लिए सहायक हो सकते हैं।
गीक

8

GNU सिस्टम पर आपको उपयोग करने की आवश्यकता होगी sedया यदि आपका स्थान मल्टीबाइट वर्णों का उपयोग करता है ( जैसा कि जिमीज बताता है ) क्योंकि GNU trकेवल एक चरित्र प्रति बाइट का संदर्भ दे सकता है। ASCII लोकेल में आप सभी डुप्लिकेट को हटा सकते हैं trजैसे / w :

LC_ALL=C tr -s '\0-\255' <input

इसलिए...

echo Thhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\0-\255'

... प्रिंट ...

This is my name

आप इसे अपने लक्ष्य के अनुसार सीमा के अनुसार चुनिंदा तरीके से भी कर सकते हैं:

echo TThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\101-\132'

... या ...

echo TTTThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '[:upper:]'

... जो एक ही काम करते हैं, और जो दोनों प्रिंट करते हैं:

Thhiisss iisss mmyyy nameeee

... या उपयोग [:punct:], [:digit:], [:lower:], [:alpha:]या आप चाहते हैं जो कुछ भी। तुम भी चयन w / -cतो नकारात्मक कर सकते हैं ...

echo 'TTTThhiisss     iisss mmyyy nameeee' |
LC_ALL=C tr -cs '[:upper:]'

... प्रिंट ...

TTTThis is my name

7

इसके साथ एक तरीका sed:

sed ':X;s/\(.\)\1/\1/g;tX'

या इससे भी सरल:

sed 's/\(.\)\1*/\1/g'

( टिप्पणियों के लिए धन्यवाद कोस्टास और मिकसेर्व )।


sed 's/\(.\)\1\+/\1/g'
कोस्टैस

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