awk는 동일한 패턴의 콘텐츠 한 줄만 일치합니다.

awk는 동일한 패턴의 콘텐츠 한 줄만 일치합니다.

다음 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

관련 정보