조건이 충족되면 여러 파일을 구문 분석하고 줄을 추가하는 쉘 스크립트가 있습니까?

조건이 충족되면 여러 파일을 구문 분석하고 줄을 추가하는 쉘 스크립트가 있습니까?

저는 한 줄만 수정하기 위해 각각 여러 매개변수 섹션이 포함된 100개가 넘는 파일을 읽는 쉘 스크립트를 작성하려고 합니다. 파일의 섹션이 포함되지 않은 경우 ELLIPSOID_CODE = 123해당 ELLIPSOID_CODE = DEFAULT섹션 앞에 행을 추가하십시오 OUTPUT_PARAMETER. 파일의 섹션에 해당 항목이 포함되어 있으면 ELLIPSOID CODE = 123아무 작업도 수행하지 마세요. 작동하도록 쉘 스크립트를 구문 분석하는 데 문제가 있습니다. 아래에 샘플 파일과 시도한 코드가 있습니다.

-----------------------------------------------------------------------   ------
NUM_RUNS = 2 

INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
ELLIPSOID_CODE = 123
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest

INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest

-------------------------------------------------------------------------------

#Adds in the line "ELLIPSOID_CODE = DEFAULT" before OUTPUT_PARAMETER 

dir="/home/autotest/test/"
for i in "$dir"/*;
do
    sed -i 's:OUTPUT_PARAMETER:ELLIPSOID_CODE = DEFAULT\nOUTPUT_PARAMETER:' "$i";
done

내 코드는 ELLIPSOID_CODE = DEFAULT어쨌든 모든 섹션에 해당 줄을 추가하는 반면, 이 파일의 두 번째 섹션에만 해당 줄을 추가하고 싶습니다. 명확히 하기 위해 다음과 같이 보이도록 노력하고 있습니다.

-----------------------------------------------------------------------------
NUM_RUNS = 2 

INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
ELLIPSOID_CODE = 123
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest

INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
ELLIPSOID_CODE = DEFAULT
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest

-------------------------------------------------------------------------------

답변1

sed해결책:

sed -i '/^OUTPUT_PROJECTION_TYPE = .*/{ 
           N; s/OUTPUT_PARAMETER = .*/ELLIPSOID_CODE = DEFAULT\n&/; 
       }' /home/autotest/test/*
  • /^OUTPUT_PROJECTION_TYPE = .*/- 패턴으로 시작하는 각 줄의 경우 OUTPUT_PROJECTION_TYPE = .*(여기서 ^정규식 앵커는 문자열/줄의 시작을 나타냄):
    • N- 패턴 공간에 개행 문자를 추가한 후 패턴 공간에 다음 입력 라인을 추가합니다.
    • s/OUTPUT_PARAMETER = .*/ELLIPSOID_CODE = DEFAULT\n&/- 다음 줄이 누락된 경우 OUTPUT_PARAMETER = .*(누락되었음을 의미 ELLIPSOID_CODE = ...) - 기본 줄 앞에 추가합니다 ELLIPSOID_CODE = DEFAULT. ( &일치하는 문자열 전체를 가리킴)

답변2

먼저 OUTPUT_PARAMETER 패턴의 줄 번호를 찾았습니다. 그런 다음 변수 j가 두 번째 기존 패턴의 줄 번호에 할당된 다음 요구 사항에 따라 줄 번호를 바꿉니다. 질문이 있으시면 알려주세요.

주문하다

j=`sed -n '/OUTPUT_PARAMETER/{;=;p}' filename|sed 'N;s/\n/ /g'| awk 'NR==2{print $1}' | sed -r "s/\s+//g" | sed '/^$/d'`


sed "`echo $j`s/OUTPUT_PARAMETER = BLAH/ELLIPSOID_CODE = DEFAULT\n&/g" filename

산출

NUM_RUNS = 2

INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
ELLIPSOID_CODE = 123
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest

INPUT_FILE = /home/autotest
OUTPUT_PROJECTION_TYPE = BLAH
ELLIPSOID_CODE = DEFAULT
OUTPUT_PARAMETER = BLAH
OUT_FILE = /home/autotest

관련 정보