Parênteses quadrados duplos dentro do padrão grep

2
grep "^[[:space:]]*clientPort[^[:alpha:]]" zoo.cfg

Este é um padrão grep para extrair a linha que contém o número da porta do arquivo de configuração.

1) Normalmente em um regex, eu uso colchetes para combinar com qualquer um dos caracteres que o cercam. Aqui estou vendo :alpha: . É o mesmo que [a-zA-Z]?

2) Por que existem parênteses quadrados duplos na regex?

3) [^[:alpha:]] , O que significa o símbolo de quilate entre colchetes?

O arquivo de configuração contém a linha

clientPort=2181
    
por Madhavan Kumar 09.09.2015 / 14:12

1 resposta

4

As expressões regulares permitem que você use Expressão de cabeçalho para representar o conjunto de elementos de agrupamento. A sintaxe para Bracket Expression é [...] , onde você pode colocar em ... qualquer um dos elementos de intercalação, símbolos de agrupamento, classes de equivalência, classes de caracteres ou expressões de intervalo.

O que você usa alpha é um nome de classe de caractere, criado pelo nome da classe de local entre [: e :] . Então, você usou a expressão da classe de caracteres [:alpha:] entre Bracket Expression [[:alpha:]] .

A expressão de classe de caractere não é igual à expressão de intervalo [a-zA-Z] em algumas localidades. Veja o melhor exemplo que você pode ver:

$ LC_ALL=en_US.utf8 bash -c 'case b in [A-Z]) echo yes; esac'
yes

enquanto usa a classe de personagem, não deu nada:

$ LC_ALL=en_US.utf8 bash -c 'case b in [[:upper:]]) echo yes; esac'

O caret ^ , se colocado no início de Bracket Expression , negará a correspondência da expressão. [^[:alpha:]] corresponderá a todos os caracteres que não pertencem à classe [:alpha:] characters:

$ case 1 in [^[:alpha:]]) echo yes;; esac       
yes
    
por 09.09.2015 / 14:31