Eu tenho uma string no formato [0-9]+\.[0-9]+\.[0-9]
. Preciso extrair o primeiro, o segundo e o terceiro números separadamente. Pelo que entendi, os grupos de captura deveriam ser capazes disso. Devo ser capaz de usar sed "s/\([0-9]*\)/\1/g
para obter o primeiro número, sed "s/\([0-9]*\)/\2/g
obter o segundo número e sed "s/\([0-9]*\)/\3/g
obter o terceiro número. Em cada caso, porém, estou obtendo a string inteira. Por que isso está acontecendo?
Responder1
Não podemos dar uma resposta completa sem um exemplo de sua opinião, mas posso dizer que sua compreensão dos grupos de captura está errada. Você não os usa sequencialmente, eles apenas se referem ao regex no lado esquerdo do mesmo operador de substituição. Se você capturar, por exemplo, /(foo)(bar)(baz)/
, então foo
será \1
, bar
será \2
e baz
será \3
. Não dá para fazer s/(foo)/\1/; s/(bar)/\2/
, pois na segunda s///
chamada só há um grupo capturado, portanto \2
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]*\)/\1 : \2 : \3/'
Ou, o mais legível:
sed -E 's/([0-9]*)\.([0-9]*)\.([0-9]*)/\1 : \2 : \3/'
Responder2
Exemplo:
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'
123
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'
456
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'
78
Ou, todos juntos:
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'
123 : 456 : 78
Responder3
Use Sed com -r, --regexp-extended para evitar todos os parênteses de escape.
echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1, \2, \3/'
1234, 567, 89 #output