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Сторінка man також згадує, що майбутні версії підтримуватимуть її ${KSH_MATCH[1]}для першої групи захоплення. Доступно ще не 2017-2014).
Однак, bashви можете:
$ [[ $var =~ -\>[[:space:]]*[^[:space:]]+ ]] &&
printf '%s\n' "${BASH_REMATCH[0]}"
-> r1-ae0-2
Що краще, оскільки він перевіряє, що модель знайдена спочатку.
Якщо регекс-файли вашої системи підтримують \s/ \S, ви також можете зробити:
re='->\s*\S+'
[[ $var =~ $re ]]
З zsh, ви можете отримати повну потужність PCREs з:
$ 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
Портативно:
$ expr " $var" : '.*\(->[[:space:]]*[^[:space:]]\{1,\}\)'
-> r1-ae0-2
Якщо в рядку є декілька зустрічань шаблону, поведінка буде змінюватися залежно від усіх цих рішень. Однак жоден з них не надасть вам список розділених рядків за всіма рядками, як у вашому рішенні на grepбазі GNU .
Для цього вам потрібно буде зробити петлю вручну. Наприклад, із 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 зворотні посилання частіше позначають шаблон, який посилається на те, що було узгоджено з попередньою групою. Наприклад, \(.\)\1основний регулярний вираз відповідає одному символу, за яким йде той самий символ (він відповідає aa, а не ввімкнено ab). Це \1зворотне посилання на цю \(.\)групу захоплення за тією ж схемою.
ksh93підтримує зворотні посилання у своїх шаблонах (наприклад ls -d -- @(?)\1, перелічить імена файлів, що складаються з двох однакових символів), а не інші оболонки. Стандартні BRE та PCRE підтримують зворотні посилання, але не є стандартними ERE, хоча деякі програми ERE підтримують його як розширення. bash«S [[ foo =~ re ]]використовує Eres.
[[ aa =~ (.)\1 ]]
не збігатиметься, але
re='(.)\1'; [[ aa =~ $re ]]
може, якщо ERE системи підтримують його.