ksh93e zshter referência anterior (ou mais precisamente 1 , referências para capturar grupos na substituição), suporte interno ${var/pattern/replacement}, nãobash .
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
(a mkshpágina de manual também menciona que versões futuras o apoiarão com${KSH_MATCH[1]} o primeiro grupo de capturas. Ainda não disponível a partir de 25/04/2017).
No entanto, com bash, você pode fazer:
$ [[ $var =~ -\>[[:space:]]*[^[:space:]]+ ]] &&
printf '%s\n' "${BASH_REMATCH[0]}"
-> r1-ae0-2
O que é melhor, pois verifica se o padrão é encontrado primeiro.
Se o regexps do seu sistema suportar \s/ \S, você também poderá:
re='->\s*\S+'
[[ $var =~ $re ]]
Com zsh, você pode obter todo o poder dos PCREs com:
$ set -o rematchpcre
$ [[ $var =~ '->\s*\S+' ]] && printf '%s\n' $MATCH
-> r1-ae0-2
Com zsh -o extendedglob, veja também:
$ printf '%s\n' ${(SM)var##-\>[[:space:]]#[^[:space:]]##}
-> r1-ae0-2
Portably:
$ expr " $var" : '.*\(->[[:space:]]*[^[:space:]]\{1,\}\)'
-> r1-ae0-2
Se houver várias ocorrências do padrão na cadeia, o comportamento variará com todas essas soluções. No entanto, nenhum deles fornecerá uma lista separada por nova linha de todas as correspondências, como no seu GNU-grep solução baseada .
Para fazer isso, você precisaria fazer o loop manualmente. Por exemplo, com bash:
re='(->\s*\S+)(.*)'
while [[ $var =~ $re ]]; do
printf '%s\n' "${BASH_REMATCH[1]}"
var=${BASH_REMATCH[2]}
done
Com zsh, você pode recorrer a esse tipo de truque para armazenar todas as correspondências em uma matriz:
set -o extendedglob
matches=() n=0
: ${var//(#m)->[[:space:]]#[^[:space:]]##/${matches[++n]::=$MATCH}}
printf '%s\n' $matches
1 referências posteriores designam mais comumente um padrão que faz referência ao que foi correspondido por um grupo anterior. Por exemplo, a \(.\)\1expressão regular básica corresponde a um único caractere seguido pelo mesmo caractere (corresponde a aa, não a ab). Essa \1é uma referência a isso\(.\) grupo de captura no mesmo padrão.
ksh93suporta referências posteriores em seus padrões (por exemplo ls -d -- @(?)\1, listará os nomes de arquivos que consistem em dois caracteres idênticos), e não outros shells. BREs e PCREs padrão suportam referências anteriores, mas não o ERE padrão, embora algumas implementações do ERE o suportem como uma extensão. bashé [[ foo =~ re ]]usos EREs.
[[ aa =~ (.)\1 ]]
não vai combinar, mas
re='(.)\1'; [[ aa =~ $re ]]
pode se os EREs do sistema o suportarem.