awk は同じパターンのコンテンツの 1 行だけに一致します。

awk は同じパターンのコンテンツの 1 行だけに一致します。

次のawkスクリプトはSAMPLEブロックにエントリを追加します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    <-------

ブロックマッチング[serverClass:NOTES]にのみ追加するには、上記のawkコマンドで何を変更する必要がありますか?

期待される:

[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

関連情報