Esta é a primeira vez que escrevo bash, então provavelmente estou cometendo um erro fácil.
Basicamente, estou tentando escrever um script que obtenha os grupos de um usuário e, se eles estiverem em um determinado grupo, registrará isso de acordo. Evidentemente, haverá mais funcionalidades, mas não adianta criar isso quando eu nem consigo fazer o regex funcionar!
Até agora, eu tenho o seguinte:
#!/bin/bash
regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
# example output
groups="username : username usergroup"
echo "$groups" >> /home/jrdn/log
if [[ "$groups" =~ $regex ]]; then
echo "Match!" >> /home/jrdn/log
else
echo "No match" >> /home/jrdn/log
fi
Em todo lugar que eu tentei esse regex, ele funciona. Mas no script bash, ele apenas gera o $groups
, seguido por No match
. Então, alguém pode me dizer o que há de errado com isso?
^([a-zA-Z0-9\-_]+)
depois adicione os dois pontos e assim por diante ... você deve descobrir em breve, onde está o problema.Respostas:
De
man 7 regex
:Tentar o regexp com o egrep dá um erro:
Aqui está uma versão mais simples, que também fornece um erro:
Como
\
não é especial, é um intervalo, exatamente como[a-z]
seria. Você precisa colocar o seu-
no final, como[_-]
ou:Isso deve funcionar independentemente da sua versão da libc (no egrep ou no bash).
editar: isso também depende das configurações de localidade. A página de manual alerta sobre isso:
Por exemplo:
Obviamente, mesmo que não tenha errado, não está fazendo o que você deseja:
É uma gama, que em ASCII, inclui
\
,[
,^
, e_
.fonte
egrep
não dá erro, apenas corresponde corretamente.LC_COLLATE="en_US.UTF-8"
:?-
...Regra geral com regexps (e quaisquer bugs em partes maiores de código): reduza-o e reconstrua-o passo a passo ou use a divisão - o que funcionar melhor para você.
Nesse caso, o culpado acabou sendo o sublinhado - escapar com uma barra invertida fez com que funcionasse.
fonte