저는 한 줄만 수정하기 위해 각각 여러 매개변수 섹션이 포함된 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