বাশ কোনও স্ট্রিং থেকে প্রথম এবং শেষ অক্ষরগুলি সরিয়ে দেয়


98

আমার মতো স্ট্রিং রয়েছে:

|abcdefg|

এবং আমি |শুরুতে এবং এর শেষে দুটি অক্ষর ছাড়াই মূল স্ট্রিং সহ একরকম (স্ট্রিং 2 এর মতো) ডাকা একটি নতুন স্ট্রিং পেতে চাই যাতে আমার কাছে এটি থাকে:

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|"
এনজোটিব

1
@ এঞ্জোটিব আপনার সর্বদা দুর্দান্ত awkসমাধান রয়েছে। আমি শিখতে হবে awk
ক্রিস হার্পার

3
এবং এছাড়াও IFS='|' read string2 <<< $string:)
ব্যবস্থা করুন

10
এবং এছাড়াও, বাশ 4.2 এবং আরও "${string:1:-1}"
নতুনতে

"প্যারামিটার সম্প্রসারণ" বিভাগের অধীনে পড়ুন man bash
নিমো

62

এখানে একটি সমাধান যা স্ট্রিংয়ের দৈর্ঘ্যের (বাশ) এর চেয়ে আলাদা is

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

29

এখানে তালিকাভুক্ত কয়েকটি পোস্ট বন্ধ করে দেওয়া এটির সহজ উপায় বলে মনে হচ্ছে:

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

সম্পাদনা: বাশ ৪.২ সহ উবুন্টুতে কাজ করে; 4.1 ব্যাশ সহ সেন্টোস-এ কাজ করে না


19

আর একটি উপায় হ'ল ব্যবহার headtailআদেশগুলি:

$ 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আরও তথ্যের জন্য
দিমিত্রি Khamitov


9

| মুছে ফেলার জন্য আপনি সেড ব্যবহার করতে পারেন কেবল প্রতীকটিই উল্লেখ না করে অবস্থানগত রেফারেন্সগুলি যেমনটি ব্যবহার করেছেন:

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

যেখানে ':' হ'ল ডিলিমিটার (আপনি এগুলি / বা কোনও চরিত্রের সাথে কোয়েরিতে নেই, সাইন অনুসরণ করে যে কোনও চিহ্ন এটি করবে) এখানে ^ (ক্যারেট) অর্থ ইনপুট স্ট্রিংয়ের শুরুতে এবং $ (ডলার) মানে শেষে. দ্য . (পয়েন্ট) যে এটি ক্যারেটের পরে এবং ডলারের চিহ্নের আগে এটি একটি একক চরিত্রকে উপস্থাপন করে। সুতরাং অন্য কথায় আমরা প্রথম এবং শেষ অক্ষর মুছে ফেলছি। মনে রাখবেন এটি | কোনও অক্ষর মুছে ফেলবে | এটি স্ট্রিং উপস্থিত নেই।

গো EX:

$ 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-substedia.html থেকে

${var#Pattern}
থেকে সরান সবচেয়ে কম অংশ মিল সামনে শেষ এর । থেকে সরান দীর্ঘতম অংশ মিল ফিরে শেষ এর । $var$Pattern$var
${var%%Pattern}
$var$Pattern$var

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.