Como substituir algumas letras em uma palavra de comprimento múltiplo que consiste em dígitos e letras em um formato específico?

1

Eu tenho um arquivo no qual desejo alterar todo o código que possui o seguinte formato: n{,3}L{,2}n{,5} where n= [0-9] any number and L [a-zA-Z] any letter either capital or not

Eu quero mudar A ou a para AB e d ou D para DK, algo assim:

 Annnnn--> ABnnnnn ; Dnnn-->DKnnn 

o arquivo se parece com:

$ cat filename
123a67,64,xx
A67990,12,ttt
89d7,34,ggg
234AB445,78,ooo
145aB7699,67,rrr
278Dk89,25,ppp

Eu tentei o seguinte script sed

sed 's/[aA]/AB/g;s/[dD]/DK/g' filename

funciona para instâncias que têm apenas A ou D, mas para aquelas que já são AB ou DK, soma-se a letra como AB--> ABB or DK-->DKK . Qualquer ajuda apreciada com explicação. Obrigado!

    
por Daniel 01.12.2016 / 22:56

1 resposta

3

Quanto ao erro do seu script, você está substituindo A ou a por AB e D ou d por DK , portanto, qualquer B ou K preexistente não seria afetado; sed não está procurando por isso. Você pode colocar um opcional [bB] ou [kK] usando ? (zero ou um dos caracteres anteriores) para fazer com que ele substitua esse caractere também se ocorrer.

Para garantir que a substituição só aconteça se [aA] ou [aA][bB] etc for seguido por um número, você poderá adicionar o número ao padrão e adicioná-lo novamente à substituição por () e

sed -r 's/ab?([0-9])/AB/Ig;s/dk?([0-9])/DK/Ig' filename

Estou usando -r para usar ERE (portanto, não é preciso escapar de ? ) e I para pesquisa sem distinção entre maiúsculas e minúsculas, em vez de usar classes de caractere.

    
por 01.12.2016 / 23:15