substituindo um ponto por um caractere usando sed ou perl

0

Eu tenho um arquivo como este

KN1234.1
KN2345.1
KN1233.1

Eu quero substituir o. com v para que eu possa obter saída como

KN1234v1
KN2345v1
KN1233v1

Depois do. é sempre 1, mas depois do KN também posso ter até 5 dígitos. Algo como isso também é possível KN14345.1 e sua saída deve ser KN14345v1

Eu tentei o comando sed

sed 's/KN\d+.1/KN\d+v1/g' file.txt

mas nada aconteceu. Como posso consertar isso?

A solução Perl também seria apreciada.

Obrigado

    
por user3138373 04.10.2016 / 20:34

1 resposta

2

Isto:

sed 's/KN\d+.1/KN\d+v1/g' file.txt

não faz nada porque o seu sed provavelmente não suporta \d (eu acho que é do Perl), então o padrão não combina com nada. Você pode querer se referir a isto: Por que minha expressão regular funciona em X, mas não em Y?

Não funcionaria como você deseja, pois o \d apenas escapa do d na peça de substituição e + não é especial, então seus números são substituídos.

Em Perl, você pode querer algo assim:

perl -pe 's/(KN\d+)\.1/$1v1/'  file.txt 

Onde $1 se expande para o primeiro grupo entre parênteses, e o ponto é escapado, pois é regex para qualquer caractere . Ou

perl -pe 's/KN\d+\K\.1/v1/'  file.txt 

Onde \K mata a parte anterior da correspondência, para que não seja substituída.

No entanto, se você não se importar com o contexto do ponto, use tr . (ou tr/// em Perl).

    
por 04.10.2016 / 21:21

Tags