बैश एक स्ट्रिंग से पहले और अंतिम पात्रों को हटा दें


98

मेरे पास एक स्ट्रिंग है जैसे:

|abcdefg|

और मैं |शुरुआत में और इसके अंत में दो पात्रों के बिना मूल स्ट्रिंग के साथ किसी एक स्ट्रिंग (जैसे string2) में बुलाया जाना चाहता हूं ताकि मेरे पास यह हो:

abcdefg

क्या यह बाश में संभव है?

जवाबों:


120

तुम कर सकते हो

string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2

या यदि आपकी स्ट्रिंग की लंबाई स्थिर है, तो आप कर सकते हैं

string="|abcdefg|"
string2=${string:1:7}
echo $string2

इसके अलावा, यह काम करना चाहिए

echo "|abcdefg|" | cut -d "|" -f 2

यह भी

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'

2
और यह भीawk -F\| '{ print $2 }' <<<"|string|"
enzotib

1
@enzotib आपके पास हमेशा शांत awkसमाधान होते हैं। मुझे सीखने की जरूरत है awk
क्रि हार्पर

3
और भी IFS='|' read string2 <<< $string:)
व्यवस्था करें

10
और भी, बैश 4.2 और नए में,"${string:1:-1}"
गीरा जूल

में "पैरामीटर विस्तार" अनुभाग के तहत पढ़ें man bash
नेमो

62

यहाँ एक समाधान है जो स्ट्रिंग की लंबाई से स्वतंत्र है (बैश):

string="|abcdefg|"
echo "${string:1:${#string}-2}"

29

यहाँ सूचीबद्ध कुछ पदों से हटकर यह ऐसा करने का सबसे सरल तरीका लगता है:

string="|abcdefg|"
echo ${string:1:-1}

संपादित करें: बश 4.2 के साथ ubuntu पर काम करता है; 4.1 के साथ सेंट पर काम नहीं करता है 4.1


19

एक और तरीका उपयोग headऔर tailआदेश है:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg

1
मेरे पास [something something]ब्रैकेट्स को काटने के लक्ष्य के साथ एक स्ट्रिंग थी , इसलिए echo "[something something]" | tail -c +2 | head -c -2काम किया। एक टिप के लिए धन्यवाद!
ऐन तोवहरी

जाहिर है, यह होना चाहिए echo -n "|abcdefg|" | tail -c +2 | head -c -1। मुझे यकीन नहीं है कि मेरे संपादन क्यों अस्वीकार कर दिए गए ... यह बहुत दुख की बात है, ईमानदार होना। man headअधिक जानकारी के लिए देखें
दिमित्री खमितोव


9

हटाने के लिए आप sed का भी उपयोग कर सकते हैं | न केवल प्रतीक को संदर्भित करना, बल्कि इसमें स्थितीय संदर्भों का उपयोग करना:

$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg

जहाँ ':' सीमांकक हैं (आप उन्हें क्वेरी में नहीं / या किसी भी वर्ण से प्रतिस्थापित कर सकते हैं, s का अनुसरण करने वाला कोई भी संकेत यह करेगा) यहाँ ^ (caret) का अर्थ इनपुट स्ट्रिंग की शुरुआत में है और $ (डॉलर) का अर्थ है अतं मै। द। (बिंदु) कि यह कैरेट के बाद है और जो कि डॉलर के संकेत से पहले है वह एकल वर्ण का प्रतिनिधित्व करता है। इसलिए दूसरे शब्दों में, हम पहले और अंतिम पात्रों को हटा रहे हैं। ध्यान रहे यह किसी भी वर्ण को हटा देगा भले ही | यह स्ट्रिंग में मौजूद नहीं है।

पूर्व:

$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef

3

खोल समारोह

थोड़ा और अधिक क्रियात्मक दृष्टिकोण, लेकिन किसी भी प्रकार के पहले और अंतिम चरित्र पर काम करता है, समान होना जरूरी नहीं है। मूल विचार यह है कि हम एक चर ले रहे हैं, इसे चरित्र द्वारा चरित्र पढ़ रहे हैं, और केवल उन लोगों को जोड़ रहे हैं जिन्हें हम एक नया चर चाहते हैं

यहाँ उस पूरे विचार को एक अच्छे कार्य में स्वरूपित किया गया है

crop_string_ends() {
    STR="$1" 
    NEWSTR="" 
    COUNT=0 
    while read -n 1 CHAR 
    do
        COUNT=$(($COUNT+1)) 
        if [ $COUNT -eq 1 ] || [ $COUNT -eq ${#STR} ] 
        then
            continue 
        fi 
        NEWSTR="$NEWSTR"$CHAR 
    done <<<"$STR" 
    echo $NEWSTR 
}

और यहाँ वही क्रिया है:

$> crop_string_ends "|abcdefg|"                                                                                       
abcdefg
$> crop_string_ends "HelloWorld"                                                                                      
elloWorl

अजगर

>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg

या कमांड लाइन पर:

$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"                                             
abcdefg

AWK

$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'                                                      
abcdefg

माणिक

$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg

2

छोटे और सार्वभौमिक समाधान:

expr "|abcdef|" : '.\(.*\).'

इस मामले में विशेष और अनुमति है कि '|' चरित्र हो सकता है या नहीं:

expr "|abcdef" : '|*\([^|]*\)|*'

2
$ string="|abcdefg|"
$ string="${string#?}" && string="${string%%?}"
$ echo "$string"
abcdefg

से http://tldp.org/LDP/abs/html/parameter-substitution.html

${var#Pattern}
$varउस सबसे छोटे भाग से निकालें $Patternजिसके सामने का भाग मेल खाता है $var। उस सबसे लंबे भाग से निकालें जिसके पिछले सिरे से मेल खाता है ।
${var%%Pattern}
$var$Pattern$var

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