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}'
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?
Existem vários problemas com o seu código:
[...]
, 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/?:().,"+]
. 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\}'
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. 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)
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.
Tags grep regular-expression