grupos de captura sed não funcionam

grupos de captura sed não funcionam

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/gpara obter o primeiro número, sed "s/\([0-9]*\)/\2/gobter o segundo número e sed "s/\([0-9]*\)/\3/gobter 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 fooserá \1, barserá \2e bazserá \3. Não dá para fazer s/(foo)/\1/; s/(bar)/\2/, pois na segunda s///chamada só há um grupo capturado, portanto \2nã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

informação relacionada