উত্তর:
আপনি স্ট্রিং অপারেটরগুলি ব্যবহার করতে পারেন :
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
এটি সামনে থেকে '': অবধি লোভের সাথে সমস্ত কিছু ছাঁটাই করে।
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
${foo%:*}
। #
- শুরু থেকে; %
- শেষ থেকে। #
, %
- সংক্ষিপ্ততম ম্যাচ; ##
, %%
- দীর্ঘতম ম্যাচ।
echo ${pwd##*/}
কাজ করে না.
pwd
একটি চলক হিসাবে দেখেছে । ব্যবহার করে দেখুন dir=$(pwd); echo ${dir##*/}
। আমার জন্য কাজ কর!
আরেকটি উপায় হ'ল আগে এবং পরে বিপরীত হওয়া cut
:
$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef
এটি শেষ কিন্তু এক ক্ষেত্র, বা শেষে থেকে ক্ষেত্রের যে কোনও ব্যাপ্তি পেতে খুব সহজ করে তোলে।
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
, আমার যা প্রয়োজন তা ছিল! cut -b20- | rev | cut -b10- | rev
কাটাটি ব্যবহার করে শেষ ক্ষেত্রটি পাওয়া কঠিন, তবে বিশ্রী এবং পার্লের কয়েকটি সমাধান এখানে
echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'
/
চরিত্র ধারণ করে বা না করে : /a/b/c/d
এবং প্রক্রিয়া /a/b/c/d/
করার সময় একই ফলাফল দেয় ( d
) pwd | awk -F/ '{print $NF}'
। গৃহীত উত্তরের ফলাফলের ক্ষেত্রে খালি ফলাফল হয়/a/b/c/d/
/
ডিলিমিটার হিসাবে ব্যবহার করবে এবং যদি আপনার পথটি হয় তবে /my/path/dir/
এটি সর্বশেষ ডিলিমিটারের পরে মানটি ব্যবহার করবে, যা কেবল একটি খালি স্ট্রিং। সুতরাং আপনার যদি আমার মতো এমন কাজ করার দরকার হয় তবে স্ল্যাশ অনুসরণ করা এড়ানো ভাল।
awk '{$NF=""; print $0}' FS=: OFS=:
প্রায়শই এর মতো কিছু ভালভাবে কাজ করে।
মোটামুটি সহজ ব্যবহার ধরে নিচ্ছেন (উদাহরণস্বরূপ ডিলিমিটারের নিস্তার নেই), আপনি গ্রেপ ব্যবহার করতে পারেন:
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
ভাঙ্গন - লাইন (the) এর শেষে ডিলিমিটার ([^:]) না হয়ে সমস্ত অক্ষর সন্ধান করুন। -ও কেবল ম্যাচের অংশটি মুদ্রণ করে।
একমুখী:
var1="1:2:3:4:5"
var2=${var1##*:}
আরেকটি, একটি অ্যারে ব্যবহার করে:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
var2=${var2[@]: -1}
অ্যারে সহ আরও একটি:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
count=${#var2[@]}
var2=${var2[$count-1]}
বাশ (সংস্করণ> = 3.2) নিয়মিত এক্সপ্রেশন ব্যবহার করে:
var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}
$ echo "a b c d e" | tr ' ' '\n' | tail -1
e
ডিলিমিটারটিকে কেবল একটি নতুন লাইনে অনুবাদ করুন এবং এর সাথে শেষ প্রবেশটি চয়ন করুন tail -1
।
\n
তবে বেশিরভাগ ক্ষেত্রে সর্বাধিক পঠনযোগ্য সমাধান।
ব্যবহার sed
:
$ echo '1:2:3:4:5' | sed 's/.*://' # => 5
$ echo '' | sed 's/.*://' # => (empty)
$ echo ':' | sed 's/.*://' # => (empty)
$ echo ':b' | sed 's/.*://' # => b
$ echo '::c' | sed 's/.*://' # => c
$ echo 'a' | sed 's/.*://' # => a
$ echo 'a:' | sed 's/.*://' # => (empty)
$ echo 'a:b' | sed 's/.*://' # => b
$ echo 'a::c' | sed 's/.*://' # => c
যদি আপনার শেষ ক্ষেত্রটি একক অক্ষর হয় তবে আপনি এটি করতে পারেন:
a="1:2:3:4:5"
echo ${a: -1}
echo ${a:(-1)}
বাশে স্ট্রিং ম্যানিপুলেশন পরীক্ষা করুন ।
a
শেষ, না ক্ষেত্র ।
এখানে অনেক ভাল উত্তর আছে, কিন্তু তবুও আমি বেসনামটি ব্যবহার করে এটি ভাগ করতে চাই :
basename $(echo "a:b:c:d:e" | tr ':' '/')
তবে আপনার স্ট্রিংয়ে ইতিমধ্যে কিছু '/' থাকলে তা ব্যর্থ হবে । যদি স্ল্যাশ / যদি আপনার ডিলিমিটার হয় তবে আপনাকে কেবল বেসনামটি ব্যবহার করতে হবে (এবং হওয়া উচিত)।
এটি সেরা উত্তর নয় তবে এটি কেবল দেখায় যে আপনি কীভাবে আদেশ আদেশ ব্যবহার করে সৃজনশীল হতে পারেন।
ব্যাশ ব্যবহার
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0
echo ${!#}
পরিবর্তে ব্যবহার করতে পারে eval echo \$${#}
।
for x in `echo $str | tr ";" "\n"`; do echo $x; done
পাইথনের সাথে যারা স্বাচ্ছন্দ্য বোধ করেন তাদের জন্য https://github.com/Russell91/pythonpy এই সমস্যাটি সমাধান করার জন্য একটি দুর্দান্ত পছন্দ।
$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'
Pythonpy সাহায্যের থেকে: -x treat each row of stdin as x
।
এই সরঞ্জামটির সাহায্যে পাইথন কোডটি লেখা সহজ যা ইনপুটটিতে প্রয়োগ হয়।
উত্তর সহ কিছুটা দেরি হতে পারে যদিও একটি সহজ সমাধান হ'ল ইনপুট স্ট্রিংয়ের ক্রমটিকে বিপরীত করা। এটি আপনাকে সর্বদা শেষ আইটেমটি দৈর্ঘ্য নির্বিশেষে অর্জন করার অনুমতি দেবে।
[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1
5
তবে এটি লক্ষণীয় গুরুত্বপূর্ণ, যদি এই পদ্ধতিটি ব্যবহার করে এবং সংখ্যাগুলি 1 ডিজিটের চেয়ে বড় হয় (বা কোনও পরিস্থিতিতে এক বর্ণের চেয়ে বড়), আপনাকে পাইপযুক্ত আউটপুটটির উপরে আরেকটি 'রেভ' কমান্ড চালাতে হবে।
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1
42
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1 | rev
24
আশা করি আমি সাহায্য করতে পারি, চিয়ার্স
আপনি যদি পাইথন পছন্দ করেন এবং প্যাকেজ ইনস্টল করার বিকল্প রাখেন তবে আপনি পাইথন ইউটিলিটিটি ব্যবহার করতে পারেন ।
# install pythonp
pythonp -m pip install pythonp
echo "1:2:3:4:5" | pythonp "l.split(':')[-1]"
5
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
প্যাকেজের পুরো উদ্দেশ্যটি python -c
হ'ল কম চরিত্রের টাইপের মতো একই কাজগুলি করা। সংগ্রহস্থলটিতে README দেখুন দয়া করে।
5
স্ট্রিং থাকলে1:2:3:4:5:
(স্ট্রিং অপারেটরগুলি খালি ফলাফল উপস্থাপন করলে) ফিরে আসে। সমাপ্তি/
অক্ষর (বা না) থাকতে পারে এমন পাথগুলি পার্স করার সময় এটি বিশেষত সহজ ।