Corresponde a regex em ksh

7

Estou procurando fazer algo assim no KSH:

if (( $var = (foo|bar)[0-9]*$ )); then
    print "variable matched regex"
fi

É possível?

Para o registro estou usando o Ksh Version M-11/16/88i em uma máquina Solaris 10.

    
por rahmu 19.10.2011 / 14:51

5 respostas

8

O Ksh tem expressões regulares, mas não na sintaxe normal (não em a versão no Solaris 10 ).

if [[ $var = *@(foo|bar)*([0-9]) ]]; then …

No manual , veja em "expressões condicionais "Para o que está dentro dos colchetes e sob" geração de nome de arquivo "para a sintaxe do padrão.

    
por 20.10.2011 / 18:43
4

Usar case com padrões glob pode funcionar para você. O padrão composto *(pattern-list) significa "Corresponde a zero ou mais ocorrências dos padrões fornecidos" e @(pattern-list) significa "Corresponde exatamente a um dos padrões fornecidos."

matcher() {
  typeset var="$1"
  case "$var" in
    *@(foo|bar)*([0-9])) print "$var matched" ;;
    *) print "$var did not match" ;;
  esac
}

for var in foo bar baz foo123 abc_foo132 abc_foo123z bar1 1bar1 1bar1a; do 
  matcher "$var"
done

Saídas:

foo matched
bar matched
baz did not match
foo123 matched
abc_foo132 matched
abc_foo123z did not match
bar1 matched
1bar1 matched
1bar1a did not match
    
por 19.10.2011 / 16:16
2

Por que não usar egrep (1) ? Dá a você tudo que um usuário regex poderia desejar:

 if echo "$var" | egrep -s '(foo|bar)[0-9]*$'    # -s means "silent"
  then
    ...

Nota adicional para o Solaris: Com o Solaris, você pode querer verificar a página de manual para egrep - há outra versão do egrep localizada em /usr/xpg4/bin/egrep que suporta mais alguns opções e difere em funcionalidade quando se trata de coisas de regex avançadas.

    
por 20.10.2011 / 10:00
1

Eu fiz algo assim, usando sed . Eu não sei como é bom, mas pelo menos funcionou ^^

if [ -z "$(echo "$var" | sed -e 's/(foo|bar)[0-9]*$//')" ]; then
    print "variable matched regex"
fi
    
por 19.10.2011 / 16:09
0

Eu sei que estou atrasado para a festa, mas em vez da solução da ktf:

 if echo "$var" | egrep -s '(foo|bar)[0-9]*$'    # -s means "silent"
  then
    ...

você também pode usar

 if grep -q '(foo|bar)[0-9]*$' <<< "$var"        # -q means "quiet" ;-)
  then
    ...

Esta técnica com o operador <<< é chamada de herestring . No entanto, também devo adicionar um aviso : isso NÃO funcionará em um ambiente somente leitura (ou seja, você obterá mensagens de erro desagradáveis para stderr ), pois o herestring exige que um arquivo temporário seja escrito para algum lugar. Até onde sei, a maneira "clássica" com echo e um pipe também funciona sem qualquer permissão de gravação.

    
por 14.12.2013 / 03:52