Eu tenho uma sequência do formato [0-9]+\.[0-9]+\.[0-9]
. Preciso extrair os 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]*\)/\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 recebendo toda a string. Por que isso está acontecendo?
27
's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'
capturar números individuais.Respostas:
Não podemos fornecer 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 se referem apenas à regex no lado esquerdo do mesmo operador de substituição. Se você capturar, por exemplo,,
/(foo)(bar)(baz)/
entãofoo
será\1
,bar
será\2
ebaz
será\3
. Você não pode fazer issos/(foo)/\1/; s/(bar)/\2/
porque, na segundas///
chamada, há apenas um grupo capturado, portanto\2
não será definido.Portanto, para capturar seus três grupos de dígitos, você precisaria:
Ou, quanto mais legível:
fonte
/(foo)/
no sed irá corresponder a um(
caractere literal , seguido porfoo
e, em seguida, um literal)
. Se você deseja capturar um grupo, precisa escapar dos parênteses ou usar a-E
opção-r
bandeira, então presumo que seja por isso que ainda não deparei com isso.-r
bandeira também fará isso, mas não é portátil. O GNU sed suporta, mas muitos outros não. O-E
é mais universal.Exemplo:
Ou, todos juntos:
fonte
Use Sed com -r, --regexp-extended para evitar todos os parênteses escapados.
fonte