sed back reference

1

Eu tenho as seguintes linhas, armazenadas no arquivo de texto tel2 :

Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava|926/448/829
Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava|926.443.602

Minha intenção é colocar o número do telefone como o início de cada linha, então eu fiz:

sed 's/\(.*13...|[^|]*\)\(.*\)$//' tel2.txt

Eu obtive apenas o primeiro grupo como saída, ignorando o segundo grupo capturado. Mas se eu colocar um \ n entre \ 2 e \ 1, ele gera o segundo grupo primeiro, e o primeiro em uma nova linha, então não é o regex.    O primeiro grupo está sobrescrevendo o segundo ?, estou faltando alguma coisa?

Obrigado antecipadamente!

    
por S.Ith 20.09.2017 / 01:52

1 resposta

1

Com base nos comentários, o problema é que o arquivo tem finais de linha CRLF no estilo DOS e seu segundo grupo de captura captura o CR e o move para o meio do padrão de saída, como você pode ver usando cat -et para tornar os finais de linha explícitos:

$ sed 's/\(.*13...|[^|]*\)\(.*\)$//' tel2.txt | cat -et
|926/448/829^MHernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava$
|926.443.602^MGomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava$

Uma possível solução seria excluir o CR do segundo grupo:

$ sed 's/\(.*13...|[^|]*\)\(.*\)\r$/\r/' tel2.txt | cat -et
|926/448/829Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$
|926.443.602Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$

(se você não quiser finalizações no estilo DOS no resultado, omita o \r na substituição).

Eu suspeito que você não queira realmente o delimitador na frente - uma expressão mais simples que lide com os delimitadores de forma mais sensata seria

sed 's/\(.*\)|\([^|]*\)\r/|\r/'

ex .:

$ sed 's/\(.*\)|\([^|]*\)\r/|\r/' tel2.txt | cat -et
926/448/829|Hernandez Darin, Alberto|plaza mayor|13190|Corral de Calatrava^M$
926.443.602|Gomez Badenas, Josefina|calle Sagasta|13190|Corral de Calatrava^M$
    
por steeldriver 20.09.2017 / 13:13