Substitua as linhas após um determinado número de correspondências em linhas separadas por AWK

Substitua as linhas após um determinado número de correspondências em linhas separadas por AWK

Atualmente estou usando o AWK para localizar e substituir uma parte de uma string após as três primeiras ocorrências de um padrão. A string é formatada assim: func(tempID="39849235",count='12');e há muitas dessas strings no arquivo, conforme mostrado abaixo:

func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');

Usandoesse link, consegui encontrar um método de usar o AWK para localizar e substituir as três primeiras instâncias da string. Eu mudei para o que eu precisava fazer e um trecho do meu script está abaixo:

id=12349876
awk -v id="$id" 'BEGIN {matches=0}
     matches < 3 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id"\""); matches++ }
     { print $0 }' filName.py >filName.py.changed

O objetivo do código acima é corresponder qualquer linha contendo tempID e substituir o número atribuído a tempID por um valor mantido em uma variável chamada $id. Localizar e substituir funciona bem, mas agora quero substituir as instâncias 4 a 9 por um número diferente. Tentei o seguinte método, mas ele substituiu apenas as 5 primeiras instâncias do tempID:

id2=39843237
awk -v id2="$id2" 'BEGIN {matches=4}
     matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id2"\""); matches++ }
     { print $0 }' filName.py >filName.py.changed

Existe outra maneira de implementar isso para que esse intervalo de valores seja substituído? Não precisa ser com AWK, pode ser com sed ou qualquer outro utilitário Linux. Além disso, a solução não precisa necessariamente terminar em um determinado ponto e pode substituir todas as instâncias após a terceira linha, mas se houver uma solução que possa fazer isso, seria uma vantagem.

Responder1

Você matches=4e matches < 9significa "suponha que já houve 4 partidas, aja até que haja 9 no total". É por isso que as primeiras 5 instâncias são substituídas. Você precisa iniciar o formulário 0 como antes e incluir o limite inferior na lógica:

id2=39843237
awk -v id2="$id2" 'BEGIN {matches=0}
 matches >=3 && matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id2"\"") }
 /.*tempID.*/ { matches++ }
 { print $0 }' filName.py >filName.py.changed

Observe que você precisa fazer a substituição de acordo com o valor de matchesmas você precisa aumentar esse valor toda vez que ocorrer uma correspondência. Seu código original substituiu o texto e aumentou o valor em um bloco. Quando não havia reposição por matchesser muito alto, o valor não era aumentado mais, mas isso não importava mais. Agora você não pode fugir com essa abordagem simples. Quando não há reposição por matchesestarmuito baixo, você ainda precisará aumentar o valor se for encontrada uma string correspondente.

Daí os dois {}blocos com condições separadas.

informação relacionada