bash: expressões regulares na expressão if

2

No meu script na minha máquina Ubuntu eu declaro uma string como esta:

DEBUG_PACKAGE_LIST=$(apt-cache search dbg | awk '{ print $1 }' | grep -e "-dbg")

Para ajudar você a entender meu problema, aqui é a saída de p>

echo $DEBUG_PACKAGE_LIST >> debug

Os seguintes

if [[ ! $DEBUG_PACKAGE_LIST =~ "[^-a-z0-9]libmagick++5-dbg[a-z]*" ]]; then 
   echo "no contained"; 
fi

echos "não contidos", apesar de $DEBUG_PACKAGE_LIST conter a string "libmagick ++ 5-dbgsym". Você poderia me ajudar a entender por quê?

Basicamente, minha intenção é combinar libmagick ++ 5-dbg, onde o libmagick só deve ser precedido por um caractere de espaço.

    
por GEO 01.08.2014 / 13:04

3 respostas

2

Em bash 3.2 ou acima:

shopt -u compat31
[[ ! $DEBUG_PACKAGE_LIST =~ [^-[:alnum:]]'libmagick++5-dbg' ]];

Em bash 3.1:

[[ ! $DEBUG_PACKAGE_LIST =~ '[^-[:alnum:]]libmagick\+\+5-dbg' ]];

(observe que [a-z]* é redundante, pois também corresponde à string vazia, portanto, sempre corresponderá).

Funciona em ambos:

re='[^-[:alnum:]]libmagick\+\+5-dbg'
[[ ! $DEBUG_PACKAGE_LIST =~ $re ]]
    
por 01.08.2014 / 13:25
0

Você não pode citar o expressão regular à direita de tal expressão (a menos que você esteja usando uma versão do Bash > = 3,0-alfa e < 3,2-alfa). Se você fizer isso, será tratado como uma comparação entre as strings literais.

Além disso, o Bash usa expressões regulares estendidas para =~ , onde + é um caractere especial.

    
por 01.08.2014 / 13:19
0

Você pode fazer isso com um padrão de shell, em vez de uma expressão regular. Prefira um espaço à string para que você não precise tratar o primeiro elemento de forma diferente dos outros.

if [[ " $DEBUG_PACKAGE_LIST" = *\ libmagick++5-dbg[a-z]* ]]; then 

(Você tem certeza da carta obrigatória após -dbg ? O nome do pacote termina com -dbg .)

    
por 02.08.2014 / 02:45