substituindo um ponto por um caractere usando sed ou perl

substituindo um ponto por um caractere usando sed ou perl

Eu tenho um arquivo como este

KN1234.1
KN2345.1
KN1233.1

Quero substituir o . com v para que eu possa obter a saída como

KN1234v1
KN2345v1
KN1233v1

Depois de . é sempre 1, mas depois de KN também posso ter até 5 dígitos. Algo assim também é possível KN14345.1e sua saída deve serKN14345v1

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

Responder1

Esse:

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

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

Não funcionaria como você deseja de qualquer maneira, já que \dapenas escapa de dna peça de reposiçã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 

Where $1se expande para o primeiro grupo entre parênteses, e o ponto é escapado, já que é regex paraqualquer personagem. Ou

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

Where \Kmata a parte anterior da partida, para que não seja substituída.

Porém, se você não se importa com o contexto do ponto, use tr. (ou tr///em Perl).

informação relacionada