ksh93
এবং zsh
পিছনে রেফারেন্স (বা আরও সঠিকভাবে 1 , প্রতিস্থাপনে গ্রুপগুলি ক্যাপচারের জন্য রেফারেন্স) এর ভিতরে সমর্থন রয়েছে ${var/pattern/replacement}
, নেই bash
।
ksh93
:
$ var='Blah: -> r1-ae0-2 / [123]'
$ printf '%s\n' "${var/*@(->*([[:space:]])+([^[:space:]]))*/\1}"
-> r1-ae0-2
zsh
:
$ var='Blah: -> r1-ae0-2 / [123]'
$ set -o extendedglob
$ printf '%s\n' "${var/(#b)*(->[[:space:]]#[^[:space:]]##)*/$match[1]}"
-> r1-ae0-2
( mksh
ম্যান পৃষ্ঠাতেও উল্লেখ করা হয়েছে যে ভবিষ্যতের সংস্করণগুলি ${KSH_MATCH[1]}
প্রথম ক্যাপচার গ্রুপের সাথে এটি সমর্থন করবে 2017 2017-04-25 পর্যন্ত এখনও উপলভ্য নয়)।
তবে, এর সাথে bash
, আপনি এটি করতে পারেন:
$ [[ $var =~ -\>[[:space:]]*[^[:space:]]+ ]] &&
printf '%s\n' "${BASH_REMATCH[0]}"
-> r1-ae0-2
এটিটি নিখুঁতভাবে খুঁজে পাওয়া যায় নি যাচাই করে যা ভাল।
যদি আপনার সিস্টেমে রিজেক্সপ্স সমর্থন করে \s
/ \S
, আপনি এটি করতে পারেন:
re='->\s*\S+'
[[ $var =~ $re ]]
এর সাথে zsh
, আপনি এতে পিসিআরই এর সম্পূর্ণ ক্ষমতা পেতে পারেন:
$ set -o rematchpcre
$ [[ $var =~ '->\s*\S+' ]] && printf '%s\n' $MATCH
-> r1-ae0-2
সহ zsh -o extendedglob
, আরও দেখুন:
$ printf '%s\n' ${(SM)var##-\>[[:space:]]#[^[:space:]]##}
-> r1-ae0-2
Portably:
$ expr " $var" : '.*\(->[[:space:]]*[^[:space:]]\{1,\}\)'
-> r1-ae0-2
স্ট্রিংয়ে প্যাটার্নটির বেশ কয়েকটি ঘটনা উপস্থিত থাকলে, সমস্ত সমাধানগুলির সাথে আচরণটি পৃথক হবে। তবে এগুলির কোনওটিই আপনাকে আপনার জিএনইউ- grep
ভিত্তিক সমাধানের মতো সমস্ত মিলের নতুন লাইনের দ্বারা পৃথক তালিকা দেবে না ।
এটি করার জন্য, আপনাকে হাত দিয়ে লুপিং করতে হবে। উদাহরণস্বরূপ, এর সাথে bash
:
re='(->\s*\S+)(.*)'
while [[ $var =~ $re ]]; do
printf '%s\n' "${BASH_REMATCH[1]}"
var=${BASH_REMATCH[2]}
done
এর সাথে zsh
, আপনি সমস্ত ম্যাচকে অ্যারেতে সঞ্চয় করতে এই ধরণের কৌশলটি অবলম্বন করতে পারেন:
set -o extendedglob
matches=() n=0
: ${var//(#m)->[[:space:]]#[^[:space:]]##/${matches[++n]::=$MATCH}}
printf '%s\n' $matches
1 ব্যাক-রেফারেন্স আরও সাধারণভাবে একটি প্যাটার্ন নির্দিষ্ট করে যা পূর্ববর্তী গোষ্ঠীর সাথে কী মিলছিল re উদাহরণস্বরূপ, \(.\)\1
মৌলিক নিয়মিত অভিব্যক্তি একই অক্ষরটির পরে একক অক্ষরের সাথে মেলে (এটি মেলে aa
, চালু নয় ab
)। যে \1
একটি যে ব্যাক-রেফারেন্স \(.\)
একই প্যাটার্ন ক্যাপচার গ্রুপ।
ksh93
এর নিদর্শনগুলিতে ব্যাক-রেফারেন্সগুলিকে সমর্থন করে (উদাহরণস্বরূপ ls -d -- @(?)\1
ফাইলের নাম তালিকাভুক্ত করা হবে যা দুটি অভিন্ন অক্ষর নিয়ে গঠিত), অন্য শেল নয় not স্ট্যান্ডার্ড BREs এবং PCREs ব্যাক-রেফারেন্সগুলিকে সমর্থন করে তবে স্ট্যান্ডার্ড ERE নয়, যদিও কিছু ERE বাস্তবায়ন এটিকে এক্সটেনশান হিসাবে সমর্থন করে extension bash
এর আগে [[ foo =~ re ]]
ব্যবহার করে।
[[ aa =~ (.)\1 ]]
মিলবে না, তবে
re='(.)\1'; [[ aa =~ $re ]]
যদি সিস্টেমের EREs এটি সমর্থন করে।