awk correspondendo apenas 1 linhas com o mesmo padrão

2

O script awk a seguir adicionará uma entrada SAMPLE ao bloco NOTES . Eu tenho vários blocos com o mesmo nome. O que precisa ser alterado neste comando para adicionar a entrada SAMPLE para primeiro bloquear somente o NOTES?

um class.txt com o seguinte conteúdo.

[serverClass:NOTES:new]
 whitelist.0=TEST
 whitelist.1=FRIDAY
 whitelist.2=SPOON
 whitelist.3=GAME29

[serverClass:NOTES]
 whitelist.0=TEST
 whitelist.1=FRIDAY
 whitelist.2=SPOON
 whitelist.3=GAME29

[serverClass:NOTES:new23]
 whitelist.0=TEST
 whitelist.1=FRIDAY
 whitelist.2=SPOON
 whitelist.3=GAME29sdf

depois de executar este comando

awk -vRS= -vORS='\n\n' '
  BEGIN{z="whitelist.0=SAMPLE";FS="\n"}
  /NOTES/{
    if (/[0-9]=/){
      split($NF, a, /[.=]/);
      sub(/0/, a[2]+1, z)
    }
    sub (/$/,"\n"z ,$0)
  };1' class.txt

saída:

[serverClass:NOTES:new]
 whitelist.0=TEST
 whitelist.1=FRIDAY
 whitelist.2=SPOON
 whitelist.3=GAME29
 whitelist.4=SAMPLE    <-------

[serverClass:NOTES]
 whitelist.0=TEST
 whitelist.1=FRIDAY
 whitelist.2=SPOON
 whitelist.3=GAME29
 whitelist.4=SAMPLE    <-------

[serverClass:NOTES:new23]
 whitelist.0=TEST
 whitelist.1=FRIDAY
 whitelist.2=SPOON
 whitelist.3=GAME29sdf
 whitelist.4=SAMPLE    <-------

o que precisa ser alterado no comando acima do awk para adicionar somente a correspondência de bloco [serverClass: NOTES]?

esperado:

[serverClass:NOTES:new]
 whitelist.0=TEST
 whitelist.1=FRIDAY
 whitelist.2=SPOON
 whitelist.3=GAME29

[serverClass:NOTES]
 whitelist.0=TEST
 whitelist.1=FRIDAY
 whitelist.2=SPOON
 whitelist.3=GAME29
 whitelist.4=SAMPLE    <-------  should be

[serverClass:NOTES:new23]
 whitelist.0=TEST
 whitelist.1=FRIDAY
 whitelist.2=SPOON
 whitelist.3=GAME29sdf
    
por Hai Le 01.03.2016 / 19:56

1 resposta

2

A abordagem mais simples é usar uma variável e definir seu valor como 1 na primeira vez que NOTES for encontrado. Em seguida, informe ao seu script para adicionar apenas a nova entrada se a variável não for 1 . Por exemplo:

awk -vRS= -vORS='\n\n' '
  BEGIN{z="whitelist.0=SAMPLE";FS="\n"}
  /NOTES/ && flag!=1{
    if (/[0-9]=/){
      split($NF, a, /[.=]/);
      sub(/0/, a[2]+1, z);
      flag=1;
    }
    sub (/$/,"\n"z ,$0)
  };1' infile
    
por 01.03.2016 / 20:07