awk 只匹配 1 行具有相同模式的内容

awk 只匹配 1 行具有相同模式的内容

以下 awk 脚本将向SAMPLEblock添加一个条目NOTES。我有多个同名的块。在此命令中需要更改什么才能将条目 SAMPLE 仅添加到第一个块“NOTES”?

包含以下内容的 class.txt。

[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

运行此命令后

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

输出:

[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    <-------

上面的 awk 命令需要更改什么才能仅添加到块匹配 [serverClass:NOTES] ?

预期的:

[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

答案1

最简单的方法是使用一个变量并将其值设置为1第一次NOTES找到的时间。然后,告诉您的脚本仅在变量不是 时才添加新条目1。例如:

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

相关内容