मेरे पास एक स्ट्रिंग है जैसे:
|abcdefg|
और मैं |शुरुआत में और इसके अंत में दो पात्रों के बिना मूल स्ट्रिंग के साथ किसी एक स्ट्रिंग (जैसे string2) में बुलाया जाना चाहता हूं ताकि मेरे पास यह हो:
abcdefg
क्या यह बाश में संभव है?
मेरे पास एक स्ट्रिंग है जैसे:
|abcdefg|
और मैं |शुरुआत में और इसके अंत में दो पात्रों के बिना मूल स्ट्रिंग के साथ किसी एक स्ट्रिंग (जैसे string2) में बुलाया जाना चाहता हूं ताकि मेरे पास यह हो:
abcdefg
क्या यह बाश में संभव है?
जवाबों:
तुम कर सकते हो
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/'
awkसमाधान होते हैं। मुझे सीखने की जरूरत है awk।
IFS='|' read string2 <<< $string:)
"${string:1:-1}"
man bash।
यहाँ सूचीबद्ध कुछ पदों से हटकर यह ऐसा करने का सबसे सरल तरीका लगता है:
string="|abcdefg|"
echo ${string:1:-1}
संपादित करें: बश 4.2 के साथ ubuntu पर काम करता है; 4.1 के साथ सेंट पर काम नहीं करता है 4.1
एक और तरीका उपयोग headऔर tailआदेश है:
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
[something something]ब्रैकेट्स को काटने के लक्ष्य के साथ एक स्ट्रिंग थी , इसलिए echo "[something something]" | tail -c +2 | head -c -2काम किया। एक टिप के लिए धन्यवाद!
echo -n "|abcdefg|" | tail -c +2 | head -c -1। मुझे यकीन नहीं है कि मेरे संपादन क्यों अस्वीकार कर दिए गए ... यह बहुत दुख की बात है, ईमानदार होना। man headअधिक जानकारी के लिए देखें
और दूसरा:
string="|abcdefg|"
echo "${string//|/}"
हटाने के लिए आप sed का भी उपयोग कर सकते हैं | न केवल प्रतीक को संदर्भित करना, बल्कि इसमें स्थितीय संदर्भों का उपयोग करना:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
जहाँ ':' सीमांकक हैं (आप उन्हें क्वेरी में नहीं / या किसी भी वर्ण से प्रतिस्थापित कर सकते हैं, s का अनुसरण करने वाला कोई भी संकेत यह करेगा) यहाँ ^ (caret) का अर्थ इनपुट स्ट्रिंग की शुरुआत में है और $ (डॉलर) का अर्थ है अतं मै। द। (बिंदु) कि यह कैरेट के बाद है और जो कि डॉलर के संकेत से पहले है वह एकल वर्ण का प्रतिनिधित्व करता है। इसलिए दूसरे शब्दों में, हम पहले और अंतिम पात्रों को हटा रहे हैं। ध्यान रहे यह किसी भी वर्ण को हटा देगा भले ही | यह स्ट्रिंग में मौजूद नहीं है।
पूर्व:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
थोड़ा और अधिक क्रियात्मक दृष्टिकोण, लेकिन किसी भी प्रकार के पहले और अंतिम चरित्र पर काम करता है, समान होना जरूरी नहीं है। मूल विचार यह है कि हम एक चर ले रहे हैं, इसे चरित्र द्वारा चरित्र पढ़ रहे हैं, और केवल उन लोगों को जोड़ रहे हैं जिन्हें हम एक नया चर चाहते हैं
यहाँ उस पूरे विचार को एक अच्छे कार्य में स्वरूपित किया गया है
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
$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'
abcdefg
$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"
abcdefg
$ 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
awk -F\| '{ print $2 }' <<<"|string|"