Você precisaria usar os operadores ksh extended glob (um subconjunto deles está disponível em bash com shopt -s extglob e com zsh com set -o kshglob ) para obter o equivalente de expressões regulares (embora com um sintaxe diferente: *(x) para o equivalente de x* aqui):
shopt -s extglob # for bash
# set -o kshglob # for zsh
printf '%s\n' "${MYVAR//[[:alpha:]]*([[:alnum:]-])/}"
Ou com zsh extendedglob s, onde o equivalente de regexp * é # :
set -o extendedglob
printf '%s\n' ${MYVAR//[[:alpha:]][[:alnum:]-]#}
Algumas notas:
-
${var/pattern/replacement}substitui apenas a primeira ocorrência. Use${var//pattern/replacement}para substituir todas as ocorrências (como com o comandogno comandosed's). - você fez de seu substituto um personagem espacial. Use
${var//pattern/}(ou${var//pattern}) para substituir pela string vazia. - Você não deseja usar
echopara gerar sequências arbitrárias - Exceto em
zsh, expansões variáveis em contextos de lista precisam ser citadas - o comportamento seria diferente em comparação com sua abordagem
sedquando a variável contiver caracteres de nova linha. -
[a-z]corresponde a caracteres (elementos de agrupamento em algumas ferramentas) compreendidos entreaez, cuja lista varia de acordo com a localidade, o sistema e a ferramenta (por exemplo[a-z]combash-4.3emen_GB.UTF-8locale em um sistema GNU corresponde aA,X,é,Ẃ, mas nãoZ). Isso geralmente inclui as 26 letras minúsculas do alfabeto inglês, mas não necessariamente.[[:alpha:]]inclui caracteres (ou elementos de agrupamento) que são considerados alfabéticos (independentemente do caso) em sua localidade. Se você quiser corresponder apenas as 26 letras em inglês, use[abcdefghijklmnopqrstuvwxyz]ou corrija a localidade comoC(LC_ALL=C) e use[a-z]ou[[:lower:]]somente para letras inglesas minúsculas ou[a-zA-Z]/[[:alpha:]]para qualquer carta em inglês. -
[a-z0-9\-]insedcorresponde ao caractere de barra invertida, use[a-z0-9-](o-deve ser o primeiro ou o último a ser obtido literalmente).