বাশের কোনও স্ট্রিং থেকে শেষ এন অক্ষরগুলি কীভাবে সরিয়ে নেওয়া যায়?


202

আমার কাছে varবাশ স্ক্রিপ্টে একটি ভেরিয়েবল রয়েছে যার স্ট্রিং রয়েছে, যেমন:

echo $var
"some string.rtf"

আমি এই স্ট্রিংয়ের শেষ 4 টি অক্ষর মুছে ফেলতে এবং ফলাফলটিকে একটি নতুন ভেরিয়েবলের কাছে বরাদ্দ করতে চাই var2, যাতে

echo $var2
"some string"

কিভাবে আমি এটি করতে পারব?


উত্তর:


15

প্রথমত, আপনি কী চান সে সম্পর্কে আপনার স্পষ্ট হওয়া উচিত। যদি আপনি জানেন যে স্ট্রিংটি শেষ হয়ে গেছে .rtfএবং আপনি মুছে ফেলতে চান তবে .rtfআপনি ব্যবহার করতে পারেন var2=${var%.rtf}। প্রত্যয়টি কী তা যদি আপনি না জানেন তবে আপনি শেষের সাথে শুরু করে সমস্ত কিছু সরাতে চান .তবে আপনি ব্যবহার করতে পারেন var2=${var%.*}। আপনি যদি কেবল প্রথমটি পর্যন্ত রাখতে চান তবে .আপনি এটি ব্যবহার করতে পারেন var2=${var%%.*}। কেবলমাত্র এক পিরিয়ড থাকলে শেষ দুটি বিকল্পগুলির একই ফলাফল হয়, তবে যদি একের বেশি থাকতে পারে তবে আপনি কোনটি চান তা সিদ্ধান্ত নেওয়া উচিত।

আপনি যদি সত্যই অক্ষরগুলির যথাযথ সংখ্যা সরাতে চান তবে এখানে কিছু বিকল্প রয়েছে।

আপনি বিশেষভাবে ব্যাশ নির্দিষ্ট করেছেন, সুতরাং আমরা ব্যাশ বিল্টিনগুলি দিয়ে শুরু করব। যেটি সবচেয়ে দীর্ঘ সময় ধরে কাজ করেছে তা হ'ল আমি উপরে ব্যবহৃত একই প্রত্যয়-অপসারণ সিনট্যাক্স: চারটি অক্ষর অপসারণ করতে, ব্যবহার করুন var2=${var%????}। আপনার প্রতি অক্ষর সরানোর জন্য একটি প্রশ্ন চিহ্ন প্রয়োজন, যাতে এটি বৃহত্তর সাবস্ট্রিং দৈর্ঘ্যের জন্য অকার্যকর হয়ে পড়ে।

সামান্য নতুন নিষ্কাশন সাবস্ট্রিং হয়: var2=${var::${#var}-4}4আলাদা আলাদা অক্ষর মুছে ফেলার জন্য আপনি এখানে যেকোন সংখ্যা রাখতে পারেন। ( ${#var}স্ট্রিংয়ের দৈর্ঘ্যের দ্বারা প্রতিস্থাপন করা হয়েছে, সুতরাং এটি প্রথমটি (দৈর্ঘ্য - 4) অক্ষর রাখতে বলছে))

বাশের আরও নতুন সংস্করণ (বিশেষত 4+, যার অর্থ ম্যাকোস সহ জাহাজগুলি কাজ করবে না) আপনাকে এটিকে সরল করতে দেয় var2=${var::-4}

আপনি যদি বাস্তবে বাশ ব্যবহার না করে তবে কিছু অন্য পসিক্স-ধরণের শেল ব্যবহার করেন তবে প্রত্যয় অপসারণটি এখনও কার্যকর থাকবে, এমনকি প্লেইন পুরাতন ড্যাশগুলিতেও (যেখানে বাকী কেউই চাইবে না)। Zsh, তারা সব কাজ কিন্তু আপনি একটি দিতে হবে 0কোলন মধ্যে: var2=${var:0:-4}ইত্যাদি ksh, যদি মাসে ২0 প্রয়োজন এবং স্পষ্ট দৈর্ঘ্য -4 অভিব্যক্তি ব্যবহার করতে হবে: var2=${var:0:${#var}-4}

আপনি অবশ্যই কোনও ইউটিলিটি প্রোগ্রামের সাহায্যে এটির জন্য কমান্ড বিকল্প ব্যবহার করতে পারেন; এখানে প্রচুর পরিমাণে কাজ করবে, তবে এর মতো var2=$(cut -c -4 <<<"$var")কিছু সম্ভবত সংক্ষিপ্ত বিকল্প।


240

আপনি এটির মতো করতে পারেন:

#!/bin/bash

v="some string.rtf"

v2=${v::-4}

echo "$v --> $v2"

9
বাশ 4+ আমি মনে করি।
এটান রিজনার

69
এটি bash4+, তবে আগের সংস্করণে আপনি সামান্য দীর্ঘ ব্যবহার করতে পারেন ${v::${#v}-4}
চিপনার

8
আমার পক্ষে কাজ করেনি, বাশ বলেছে '' খারাপ প্রতিস্থাপন ''
ইভান মার্জানোভিচ

15
কোনও কারণে, zsh ${v::-4}ক্রোকেসে "zsh: বন্ধ বন্ধনী প্রত্যাশিত"। তবে নীচে @ ফ্রেডট্যান্টিনি'র উত্তর ভাল ${v:0:-4}কাজ করে।
পিয়ের ডি

6
এর সাথে ত্রুটি: -২: স্ট্রেরিং এক্সপ্রেশন <0
এডওয়ার্ড

172

স্ট্রিং ব্যবহারের শেষে থেকে চারটি অক্ষর অপসারণ করতে ${var%????}

চূড়ান্ত .ব্যবহারের পরে সবকিছু মুছে ফেলার জন্য ${var%.*}


12
খাঁটি শেল উত্তর, এবং বেসাস 3.x এ কাজ করবে যা অনেকগুলি সিস্টেমে পাওয়া যায় যা লাইসেন্স সংক্রান্ত সমস্যার কারণে BASH 4.x প্রয়োগ করতে অস্বীকার করেছে।
ডেভিড ডব্লিউ।

1
সংক্ষিপ্ত স্ট্রিং পাওয়ার বিরুদ্ধে শক্তিশালী হওয়ায় এটি দুর্দান্ত; সূচক অফসেট ভেরিয়েন্টগুলি তখন ব্যর্থ হয়।
রাফেল

ব্যাশ ৩.২.২৫ এ কাজ করে - সর্বোত্তম সম্ভাব্য উত্তর - ঠিক আমি যা খুঁজছিলাম
ক্যাপসার ২২

দুর্দান্ত উত্তর। স্ট্রিংয়ের সামনে একটি অপসারণ সম্পর্কে কীভাবে?
ব্যবহারকারী 2023370

3
@ ব্যবহারকারী2023370 ডকুমেন্টেশনের সাথে পরামর্শ করার মাধ্যমে বোঝা যায় যে এর ${var#????}জন্য প্যারামিটারের সাথে সম্পর্কিত কোনও বিকল্প রয়েছে ।
ট্রিপলি

48

আমার জন্য যা কাজ করেছিল তা হ'ল:

echo "hello world" | rev | cut -c5- | rev
# hello w

তবে আমি এটি কোনও ফাইলে লাইনগুলি ছাঁটাইতে ব্যবহার করেছি যাতে এটি বিশ্রী দেখাচ্ছে। আসল ব্যবহার ছিল:

cat somefile | rev | cut -c5- | rev

cutকেবলমাত্র কিছু সূচনা অবস্থান থেকে আপনাকে ছাঁটাই করে দেয়, আপনার যদি দৈর্ঘ্যের সারি প্রয়োজন হয় তবে এটি খারাপ। সুতরাং এই সমাধানটি revস্ট্রিংটিকে ( ) বিপরীত করে এবং এখন আমরা এর সমাপ্তি অবস্থানের সাথে সম্পর্কিত, তারপরে cutউল্লিখিত হিসাবে ব্যবহার করে এবং (আবার, rev) এটির মূল ক্রমে ফিরিয়ে দেয়।


এটি সঠিক নয় এবং যা জিজ্ঞাসা করা হচ্ছে তার কোনও উত্তর নয়। revরেখাগুলি বিপরীত করে, স্ট্রিংগুলিতে নয়। echo $SOME_VAR | rev | ...কেউ কীভাবে প্রত্যাশা করবে আচরণ করবে না।
মোহাম্মদ নাসিরফার

2
কারণ @Mohammad উদ্ধৃত ভাঙ্গা, যে হয় একটি একক লাইন।
ট্রিপলি

38

পরিবর্তনশীল সম্প্রসারণ / সাবস্ট্রিং প্রতিস্থাপন ব্যবহার :

$ {Var /% প্যাটার্ন / প্রতিস্থাপন}

যদি ভেরের প্রত্যয়টি প্যাটার্নের সাথে মেলে, তবে প্যাটার্নের জন্য প্রতিস্থাপনের বিকল্প দিন।

সুতরাং আপনি এটি করতে পারেন:

~$ echo ${var/%????/}
some string

অন্যথা,

আপনার যদি সর্বদা একই 4 টি অক্ষর থাকে

~$ echo ${var/.rtf/}
some string

যদি এটি সর্বদা শেষ হয় .xyz:

~$ echo ${var%.*}
some string

আপনি স্ট্রিংয়ের দৈর্ঘ্যও ব্যবহার করতে পারেন:

~$ len=${#var}
~$ echo ${var::len-4}
some string

বা সহজভাবে echo ${var::-4}


len=${#var}; echo ${var::len-4}সংক্ষিপ্ত করা যেতে পারে echo ${var:0:-4}:-) সম্পাদনা: বা @ আইনিজার হিসাবে উল্লেখ করা হয়েছে, ঠিক echo ${var::-4}...
anishsane

26

আপনি সেড ব্যবহার করতে পারে,

sed 's/.\{4\}$//' <<< "$var"

উদাহরণ:

$ var="some string.rtf"
$ var1=$(sed 's/.\{4\}$//' <<< "$var")
$ echo $var1
some string

1
এবং আমি কীভাবে ফলাফলটি অর্পণ করব var2?
বেকো

এটি ভাল কারণ এটি এক লাইনে এভাবে কাজ করে ... | সেডস /। \ {4 \} $ // '। ভেরিয়েবলগুলি ব্যবহার না করে ব্যবহার করা যেতে পারে
স্যাম

3

আমি নিম্নলিখিতগুলি চেষ্টা করেছিলাম এবং এটি আমার পক্ষে কাজ করেছে:

#! /bin/bash

var="hello.c"
length=${#var}
endindex=$(expr $length - 4)
echo ${var:0:$endindex}

আউটপুট: hel


1

আশা করি নীচের উদাহরণটি সাহায্য করবে,

echo ${name:0:$((${#name}-10))} -> ${name:start:len}

  • উপরের কমান্ডে, নামটি পরিবর্তনশীল।
  • start স্ট্রিং শুরুর পয়েন্ট
  • len স্ট্রিংয়ের দৈর্ঘ্য যা সরাতে হবে।

উদাহরণ:

    read -p "Enter:" name
    echo ${name:0:$((${#name}-10))}

আউটপুট:

    Enter:Siddharth Murugan
    Siddhar

দ্রষ্টব্য: বাশ 4.2 নেতিবাচক স্ট্রিংয়ের জন্য সমর্থন যুক্ত করেছে


এটিয়ান রেইজনারের উত্তরের মতো বোর্ন-সামঞ্জস্যপূর্ণ সহজ প্যাটার্ন প্রতিস্থাপনের চেয়ে অনেক বেশি ভার্বোজ।
ট্রিপলি

0

এটি স্ট্রিংয়ের আকার গণনা করে আমার পক্ষে কাজ করেছিল।
আপনার ফিরে আসা মূল্যটি প্রতিধ্বনি করা সহজ এবং তারপরে নীচের মত এটি সংরক্ষণ করুন

removechars(){
        var="some string.rtf"
        size=${#var}
        echo ${var:0:size-4}  
    }
    removechars
    var2=$?

কিছু স্ট্রিং


0

এক্ষেত্রে আপনি বেসনামটি ধরে নিয়ে ধরে নিতে পারেন যে যে ফাইলগুলি আপনি মুছে ফেলতে চান তার একই প্রত্যয় আছে।

উদাহরণ:

basename -s .rtf "some string.rtf"

এটি "কিছু স্ট্রিং" ফিরে আসবে

যদি আপনি প্রত্যয়টি জানেন না, এবং এটি শেষ বিন্দুটি সহ সমস্ত কিছু সরিয়ে ফেলতে চান:

f=file.whateverthisis
basename "${f%.*}"

"ফাইল" আউটপুট

% এর অর্থ চপ,। আপনি যা কাটছেন তা হচ্ছে * ওয়াইল্ডকার্ড

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