Eu tenho um arquivo que contém uma string muito longa de caracteres e gostaria de substituir uma substring dele por Ns. Exemplo:
teste
ABCDABCDABCD
Eu gostaria de substituir uma substring dela por todas as letras N com o comando awk e sed, todos os caracteres do índice 5 a 8, então o comprimento total da letra N é 4.
Resultado
ABCDNNNNABCD
Eu tentei algo assim:
awk '{ v=substr($0,5,4); sed -i "s/$v/N/g";print substr($0,1,4)""v""substr($0,9,12)}' test
no entanto, este comando parece dar esta saída:
ABCDABCDABC
E nenhuma substituição foi feita
Eu gostaria de ter no código o número do índice de onde começar a substituição, (aqui, por exemplo, é 5) e o número do comprimento da substituição (aqui 4), para que eu possa modificar esses números caso Eu quero começar em outra posição e para um comprimento diferente de substituições porque, na realidade, tenho uma string com milhares de letras e quero substituir centenas de caracteres, então a substituição de padrão não funciona no meu caso
Com GNU awk, você pode fazer
Ou com perl
Com ambas as soluções, passamos os valores inicial e final para o programa com opções de linha de comando. Isso facilita a alteração dos valores de dentro de um script de shell. Se você precisar tornar o caractere de substituição N dinâmico também, deve ser bastante óbvio como.
Se você tiver GNU awk (gawk), você pode definir
FIELDWIDTHS
para dividir a linha em campos com base nas posições dos caracteres. Isso é particularmente conveniente para o seu caso na versão gawk >= 4.2, que suporta uma largura de campo à direita "curinga". Você pode então substituir caracteres no segundo campo usandogsub
:Em versões mais antigas do gawk, você pode simular
*
escolhendo um tamanho máximo adequado para o campo à direita:Ver
Processando dados de largura fixa
Capturando dados de rastreamento opcionais
Usando sed
Para substituir os caracteres de 5 a 8 por
N
:Como funciona:
(.{4})
captura os primeiros quatro caracteres do grupo 1..{4}
corresponde aos próximos quatro caracteres.\1NNNN
substitui o acima com o grupo 1 e quatroN
.Usando GNU awk
Como funciona:
-F ""
diz ao awk para tratar cada caractere como um campo separado.for (i=5; i<=8; i++) $i="N"
faz um loop sobre cada caractere de 5 a 8 e o altera paraN
.1
diz ao awk para imprimir a linha.Você pode fazer isso empregando os seguintes métodos como mostrado com POSIX ou GNU seds
Com o editor sed:
Com Perl:
Você pode apenas tentar com o comando abaixo
resultado