Tentando entender por que o manual do grep indica as classes de caracteres com um colchete.
https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html
Por exemplo, afirma: use [:lower:] para corresponder a letras minúsculas. Ainda no terminal, eu uso e meu resultado é:
$ grep [:lower:] test
grep: character class syntax is [[:space:]], not [:space:]
Eu tive muitos problemas tentando usar/entender este manual, o que há de errado com ele? Parece funcionar apenas com duplo [[]], mas não há nenhuma explicação de por que o manual diz apenas use [].
Porque as classes de caracteres, como tal, possuem apenas um conjunto de colchetes. Você só precisa colocá-los dentro de expressões de colchetes também, o que significa que no final você tem dois conjuntos.
O manual começa dando o contexto de uma expressão de colchetes, uma que tem, bem, os colchetes em volta dela:
Os parágrafos seguintes assumem esse contexto.
Os dois caracteres e um hífen também precisam estar entre colchetes, ou seja, tudo é
[a-f]
, não apenasa-f
. (*)As classes de caracteres também vão dentro da expressão de colchetes, então, por exemplo, uma classe de caractere
[:upper:]
é agrupada entre colchetes para fornecer a expressão de colchetes[[:upper:]]
. Ou, no caso de você colocar mais de uma classe de caracteres entre colchetes, você poderia ter[-[:upper:][:digit:]]
o que corresponderia ao hífen, letras maiúsculas ou dígitos. (um caractere simples e duas classes de caracteres em uma única expressão de colchetes).Quanto ao motivo da sintaxe ser assim, não sei.
Observe que o manual ainda tem o exemplo completo de como usar as classes de personagens:
E diz:
A mensagem de erro que você recebe também é descrita:
Portanto, realmente não parece que diga para usar apenas um conjunto de colchetes para todo o negócio.
Exceto que... O exemplo para
[:alnum:]
vai (e[:alpha:]
é semelhante):Isto é falso.
[0-9A-Za-z]
é o mesmo que[[:alnum:]]
, não[:alnum:]
.[:alnum:]
seria0-9A-Za-z
, mas precisaria dos colchetes externos para fazer algo útil.Obviamente, a mensagem de erro também não parece mencionar a distinção entre uma classe de caractere e a expressão de colchetes, então sim, eles estão sendo um pouco confusos lá.
Observe que, como os colchetes também são caracteres glob no shell, você deve citar o padrão, por exemplo
Caso contrário, o padrão seria expandido pelo shell para
:
,e
,l
,o
,r
ouw
, se existir algum arquivo com esses nomes exatos.(* Observe que as ressalvas se aplicam aos intervalos de caracteres, sua interpretação depende da localidade e no Bash a
globasciiranges
opção, que eu acho que demonstrou agir de maneira estranha.)