कुछ वर्णों को दूसरे वर्ण के साथ एक स्ट्रिंग में बदलना


279

मेरे पास AxxBCyyDEFzzLMN जैसा स्ट्रिंग है और मैं x , y , और z की सभी घटनाओं को _ के साथ बदलना चाहता हूं ।

इसे कैसे प्राप्त किया जा सकता है?

मुझे पता है कि echo "$string" | tr 'x' '_' | tr 'y' '_'काम करेगा, लेकिन मैं पाइप का उपयोग किए बिना एक बार में ऐसा करना चाहता हूं।


क्या आप किसी एक अंडरस्कोर के साथ लगातार x, y या z के किसी भी क्रम को बदलना चाहते हैं , या क्या आप प्रत्येक x, y या z को एक अंडरस्कोर से बदलना चाहते हैं ? भी, मिश्रित दृश्यों के बारे में क्या पसंद है AxyzB? तीन अंडरस्कोर या एक?
डेविड जेड

tr '[xyz]'की जगह लेगा [और ]भी। तर्क केवल वर्णों की एक सूची होनी चाहिए (हालांकि श्रेणियों की तरह a-zठीक हैं, और कुछ कार्यान्वयन में, POSIX वर्ण वर्ग जैसे [:digit:])।
तिकड़ी

जवाबों:


329
echo "$string" | tr xyz _

से प्रत्येक घटना की जगह लेंगे x, yया zके साथ _, दे A__BC___DEF__LMNअपने उदाहरण में।

echo "$string" | sed -r 's/[xyz]+/_/g'

की दोहराई जाने वाली घटनाओं की जगह लेंगे x, yया zके साथ एक एकल _, दे A_BC_DEF_LMNअपने उदाहरण में।


19
मैक पर, मुझे निम्नलिखित मिला: sed: अवैध विकल्प - r उपयोग: sed स्क्रिप्ट [-Ealn] [-i एक्सटेंशन] [फ़ाइल ...] sed [-Ealn] [-i एक्सटेंशन] [-e script]। .. [-f script_file] ... [फ़ाइल ...]
catanore

मेरे पास एक स्ट्रिंग है जिसमें ,[]{}()~वर्ण हैं। मैं इसे प्रत्येक विशेष चरित्र के साथ प्रतिस्थापित करना चाहता हूं, मैं इसे '\'कैसे प्राप्त कर सकता हूं?
इंकेका

2
@ महलकला मैक सेड के थोड़े अलग संस्करण के साथ। इस प्रश्न को देखें: unix.stackexchange.com/questions/13711/… इसके बजाय आप होमब्रे पैकेज मैनेजर के साथ "ग्नू- सेड " स्थापित कर सकते हैं, फिर gsedबाइनरी का उपयोग कर सकते हैं:$ brew install gnu-sed$ gsed -r 's/[xyz]+/_/g'
जॉन केरी

6
* BSD (और इस प्रकार, OSX), sed -E(मूल रूप से) sed -rकई लिनक्स डिस्ट्रोस के बराबर है , यदि आप उपयोग करते sed 's/[xyz][xyz]*/_/g'हैं तो आपको विकल्प की आवश्यकता नहीं है। बेशक, यह यहाँ के tr -s xyz _लिए कोई वास्तविक जरूरत के बराबर sedहै।
ट्रिपल जूल

@inckka आप इसके trलिए उपयोग नहीं कर सकते । sed 's/[][{}()~,]/\\&/g'लेकिन वास्तव में, एक नया प्रश्न पूछें यदि आपके पास एक अनुवर्ती प्रश्न है (संदर्भ के लिए यहां वापस लिंक करने के लिए स्वतंत्र महसूस करें, निश्चित रूप से)। संयोग से, ,और ~रेगेक्स मेटाचैकर नहीं हैं (हालांकि बैश और कुछ अन्य गोले द्वारा कुछ पदों में ~विस्तार हो जाता है $HOME; shहालांकि नहीं )।
ट्रिपल जूल 26'16

286

बैश पैरामीटर विस्तार का उपयोग करना :

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}

7
खराब प्रतिस्थापन
एलेक्सी

1
@ एसेक्स, मेरा उदाहरण मेरे लिए काम करता है (bash 4.3.11 (1) -release)। सुनिश्चित करें कि आप उपयोग कर रहे हैं bash। अन्य गोले काम नहीं कर सकते (हालांकि कुछ इच्छाशक्ति)।
मैथ्यू फ्लास्चेन

साभार @MatthewFlaschen यह ठीक वैसा ही था जैसा कि मुझे बैश स्क्रिप्ट में एक पूर्ण पथ के लिए एक सेड को बदलने की आवश्यकता थी (/ / with / with sed की जगह इसे स्वीकार करता है)।
रयान जी

1
@RyanG क्यों उपयोग sedअगर बैश में अंतर्निहित प्रतिस्थापन है?
MestreLion

@MestreLion गलत हो सकता है, लेकिन मुझे फ़ाइलों के एक समूह में एक मानक चर नाम को निरपेक्ष पथ के साथ बदलने की आवश्यकता थी, जिसके लिए मैं sed inplace प्रतिस्थापन का उपयोग कर रहा था। लेकिन आपके पास कमांड में इसे भागने के बिना "/" है। मैं बैश में एक साथ ऑपरेशन कर रहा था। क्या यह बैश में एक स्ट्रिंग में हेरफेर करने का सबसे अच्छा तरीका नहीं होगा?
रयान जी

111

आपको यह लिंक मददगार लग सकता है:

http://tldp.org/LDP/abs/html/string-manipulation.html

सामान्य रूप में,

$ प्रतिस्थापन के साथ $ प्रतिस्थापन के पहले मैच को बदलने के लिए:

${string/substring/replacement}

$ प्रतिस्थापन के साथ $ प्रतिस्थापन के सभी मैचों को बदलने के लिए:

${string//substring/replacement}

संपादित करें: ध्यान दें कि यह $ स्ट्रिंग नामक एक चर पर लागू होता है।


16
ध्यान दें कि यह "स्ट्रिंग" नामक एक चर पर काम करता है न कि शाब्दिक स्ट्रिंग पर।
Mattdm

1
सबसे अधिक उपयोगी, क्योंकि इसमें संदर्भ शामिल है।
Os3

सबसे अच्छा और सबसे छोटा समाधान।
northtree

8
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

^ इनमें से जितने की जरूरत हो उतने का उपयोग करें, और आप अपना खुद का BASIC एन्क्रिप्शन बना सकते हैं


5

यहाँ शेल पैरामीटर विस्तार के साथ एक समाधान है जो एक के साथ कई सन्निहित घटनाओं को बदलता है _:

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN

ध्यान दें कि पैटर्न को विस्तारित पैटर्न मिलान की आवश्यकता होती है, जिसके साथ चालू हुआ+(pattern)

shopt -s extglob

वैकल्पिक रूप से, -s("निचोड़") विकल्प के साथ tr:

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