처음 두 줄 끝에 큰따옴표 속성을 추가하려면 어떻게 해야 합니까?

처음 두 줄 끝에 큰따옴표 속성을 추가하려면 어떻게 해야 합니까?

우리는 다음 속성을 추가하려고 합니다.

-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M

-라는 단어가 포함된 처음 두 줄에서HBASE_MASTER_OPTS

변경 전 예:

more ams-hbase-env-template.txt

export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly"    
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=71 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=72 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=73 -XX:+UseCMSInitiatingOccupancyOnly"

변경된 예(예상 결과):

export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"    
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=71 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=72 -XX:+UseCMSInitiatingOccupancyOnly"
export HBASE_MASTER_OPTS=" -XX:CMSInitiatingOccupancyFraction=73 -XX:+UseCMSInitiatingOccupancyOnly"

지금까지 내가 한 일은 다음과 같습니다.

sed -i '/HBASE_MASTER_OPTS/ s/$/-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M/' ams-hbase-env-template.txt

그러나 이는 다음과 같은 이유로 잘못된 것입니다.

  1. 우리는 큰따옴표가 끝나기 전에 속성을 원합니다.

  2. 속성은 HBASE_MASTER_OPTS 변수의 처음 두 줄에만 있어야 합니다.

  3. 속성이 이미 대기열에 있으면 다음에 추가되지 않습니다!

답변1

이 솔루션은 어떻습니까 awk? 문제에서 원하는 출력을 생성합니다.

awk '/HBASE_MASTER_OPTS/&&x<2{gsub(/"$/," -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M\"");x++}1' ams-hbase-env-template.txt

온라인으로 사용해 보세요!

답변2

Steve의 답변을 확장하면 다음과 같습니다.

awk '/HBASE_MASTER_OPTS/&&/ -XX:[+]UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M/{x++;print;next}/HBASE_MASTER_OPTS/&&x<2{gsub(/"$/," -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M\"");x++}1' ams-hbase-env-template.txt

업데이트: 다음은 각 문자열이 한 번만 나타나는 유지 관리가 더 쉬운 버전입니다.

awk 'BEGIN{p="-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"}{m=0}/HBASE_MASTER_OPTS/{m=1;++x}m&&index($0,p){print;next}m&&x<=2{gsub(/"$/," " p "\"")}1' ams-hbase-env-template.txt

몇 가지 설명이 있습니다.

  • 패턴 일치의 첫 번째 버전에서는 [+]리터럴 + 문자가 사용되었습니다. 그렇지 않으면 +특수 문자로 해석되기 때문입니다.

나머지 요점은 두 번째 버전에 관한 것입니다.

  • In BEGIN절, 속성 문자열 p절이 정의되었습니다. 다음 절은 모두 입력 행에 적용됩니다.
  • {m=0}: 이 절에는 조건이 없습니다. 즉, 모든 행에 적용되므로 모든 행에 대해 먼저 m(일치하는 경우) 0으로 설정됩니다.
  • /HBASE_MASTER_OPTS/{m=1;++x}: 라인이 HBASE_MASTER_OPTS문자열과 일치 하면 m해당 라인이 설정되고 라인 카운터가 증가합니다.
  • m&&index($0,p){print;next}: 이 절은 로 표시된 일치 항목을 확인하는 것 외에도 m입력 행에 특성 문자열이 포함되어 있는지 확인합니다. 이 경우 index0이 아닌 값이 반환됩니다. 그렇다면 행을 있는 그대로 인쇄하고(더 이상 속성이 추가되지 않음) next나머지 절을 건너뛰고 다음 행 처리를 시작합니다. 다음 용어는 원래 Steve가 제공했으며 나만이 적용한 것입니다.
  • m&&x<=2{gsub(/"$/," " p "\"")}: 이 지점에 도달하고 일치하는 라인이 있고 카운터가 2를 초과하지 않는 경우 $0터미널 앞에 "공백과 수정할 속성 문자열(입력 라인)을 추가하여 수정(입력 라인)합니다. 그렇지 않으면 출력이 생성되지 않으며 이는 다음 절에서 수행됩니다.
  • 1: 이는 작업이 없는 조건(항상 true)입니다. 즉, 작업이 기본적으로 입력 줄을 인쇄한다는 의미입니다.

관련 정보