bat grupos de captura não funcionam

10

Eu tenho uma string com o formato [0-9]+\.[0-9]+\.[0-9] . Eu preciso extrair o primeiro, segundo e terceiro números separadamente. Pelo que entendi, os grupos de captura devem ser capazes disso. Eu deveria ser capaz de usar sed "s/\([0-9]*\)//g para obter o primeiro número, sed "s/\([0-9]*\)//g para obter o segundo número e sed "s/\([0-9]*\)//g para obter o terceiro número. Em cada caso, porém, estou recebendo toda a string. Por que isso está acontecendo?

    
por Melab 16.02.2016 / 18:59

3 respostas

18

Não podemos dar uma resposta completa sem um exemplo de sua contribuição, mas posso dizer que sua compreensão dos grupos de captura está errada. Você não usa o sequencialmente, eles só se referem à regex no lado esquerdo do mesmo operador de substituição. Se você capturar, por exemplo, /(foo)(bar)(baz)/ , então foo será , bar será e baz será . Você não pode fazer s/(foo)//; s/(bar)// , porque, na segunda chamada s/// , há apenas um grupo capturado, então não será definido.

Então, para capturar seus três grupos de dígitos, você precisaria fazer:

sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/ :  : /'

Ou mais legível:

sed -E 's/([0-9]*)\.([0-9]*)\.([0-9]*)/ :  : /'
    
por 16.02.2016 / 19:26
7

Exemplo:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)//'
123

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)//'
456

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)//'
78

Ou todos juntos:

$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/ :  : /'
123 : 456 : 78
    
por 16.02.2016 / 19:22
1

Use Sed com -r, --regexp-extended para evitar todos os parênteses escapados.

echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/, , /' 
1234, 567, 89    #output
    
por 21.12.2016 / 03:30

Tags