sugestão de regex

0
echo "223255/12345678                    " | grep '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'

De acordo com o regex, ele pode ter qualquer um de 0-9 a-z A-Z / - ? : ( ) . , " + de até 34 caracteres em qualquer ordem. Estou certo?

Nesse caso, por que não está imprimindo o valor ecoado?

    
por would_like_to_be_anon 26.03.2013 / 18:34

3 respostas

1

Tente usar egrep ou passar o sinal -E para grep :

echo "223255/12345678                    " | egrep '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'

ou

echo "223255/12345678                    " | grep -E '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
    
por 26.03.2013 / 18:40
4

Existem vários problemas com o seu código:

  • Dentro de [...] , os únicos caracteres especiais são - e ] (embora também haja [: que introduz classes de caracteres) e a maneira de escapar deles não é com \ , mas - tornando-o o primeiro ou último caractere na lista ( [-...] ou [...-] ) e para ] fazendo dele o primeiro ( []...] ). Acima, \-\ significa qualquer caractere no intervalo \ a \ , ou seja, inclui \ , mas não - . Então você precisaria de [-0-9a-zA-Z/?:().,"+] .
  • Tenha em atenção que os intervalos como a-z e A-Z são dependentes da localidade (como pode incluir elementos como é, ŝ ...) e também podem incluir caracteres multibyte. Se você deseja incluir somente caracteres ASCII nesses intervalos, você deve corrigir o código do idioma para C: ... | LC_ALL=C grep ...
  • {x,y} é um operador de expressão regular estendida (conforme suportado por grep -E ). O operador de expressão regular básica correspondente (conforme suportado pelo grep ) é \{x,y\} . Então LC_ALL=C grep '[-0-9a-zA-Z/?:().,"+]\{1,34\}'
  • em grep pattern , grep verifica se pattern corresponde em qualquer lugar dentro de cada linha de entrada. Se você quiser que ela corresponda à linha inteira , você precisa da opção -x (para exato ) ou ancorar o padrão no início e no fim com ^ e $ operadores regexp. grep -E 'x{1,34}' é o mesmo que grep x , porque uma linha que contém qualquer sequência de 1 a 34 x também contém um x e uma linha que contém x contém uma sequência de 1 x so corresponde a x{1,34} regexp.
  • Supondo que você esteja fazendo echo "$var" | grep the-pattern , tenha em mente que não é confiável, porque alguns echo por exemplo transformam -neen em uma sequência vazia, enquanto outros transformam \n em um caractere de nova linha, por exemplo. Observe também que grep corresponde em cada linha da entrada, não na entrada inteira, portanto, sua verificação pode não ser válida se $var puder conter caracteres de nova linha. Melhor seria usar expr ou o operador [[ $var =~ pattern ]] de ksh93, zsh ou bash.

Para resumir, se você quiser verificar se $var é feito de 1 a 34 desses caracteres ASCII, você deve escrevê-lo:

if LC_ALL=C expr "x$var" : 'x[-0-9a-zA-Z/?:().,"+]\{1,34\}$' > /dev/null; then
  echo yes
else
  echo no
fi

( expr ancora o padrão ao início implicitamente como se houvesse um operador ^ regexp)

    
por 26.03.2013 / 22:01
0

talvez escape o caractere / ..... para que é usado o (\) ? Mas parece que desde que você está entre aspas simples você não precisa escapar de tudo que você coloca lá.

Minha sugestão para depurar é remover alguns dos caracteres e ver o que está errado com seu padrão.

    
por 26.03.2013 / 18:39