
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.1
e 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 \d
apenas escapa de d
na 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 $1
se 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 \K
mata 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).