매우 간단한 구문을 가진 구성 파일인 파일을 구문 분석해야 합니다. 두 가지 유형의 여러 줄 블록과 인라인 태그가 있습니다.
유형 1 블록은 다음으로 구성됩니다.오픈 라벨그리고종료 태그블록 이름을 추가하세요. 예:
START_BLOCK_1 name
< content >
END_BLOCK_1
유형 1 블록에는 기본적으로 해당 프로필에 대한 블록을 켜거나 끄는 데 사용되는 유형 2 블록만 포함됩니다.
유형 2의 블록은 새 줄을 시작하는 마커(및 이름)로 표시되고, 새 블록이 시작되거나 파일이 끝날 때 암시적으로 끝나는 비종료 마커가 있어 블록 자체에 빈 줄이 포함될 수 있습니다.
START_BLOCK_2 name_1
< content >
< content >
< content >
START_BLOCK_2 name_2
< content >
< content >
< content >
START_BLOCK_2 name_3
< content >
< content >
마지막 종류의 태그는 줄의 시작 부분에 나타나는 특수 단어인 인라인 태그일 뿐입니다. 해당 태그의 값이 무엇인지 알고 싶습니다.
START_BLOCK_2 name_1
tag_1 red
tag_2 Jon
START_BLOCK_2 name_2
tag_1 blue
tag_2 Phil
마지막 좋은 예는 다음과 같습니다.
START_BLOCK_2 name_1
< content >
START_BLOCK_2 name_2
< content >
START_BLOCK_1 name_1
START_BLOCK_2 name_3
< content >
START_BLOCK_2 name_4
< content >
END_BLOCK_1
START_BLOCK_2 name_5
< content >
유형 2 블록의 이름이 주어지면 각 태그와 연관된 값(이미 설정된 태그가 포함된 경우)과 해당 태그가 유형 1 블록의 일부인지(이 경우 유형 1 블록의 이름 속성)를 알아야 합니다. 그것들을 포함하고 있습니다.
결과는 파일에 저장되거나 인쇄될 수 있으며, 구문 분석할 수 있는 한 나중에 출력을 형식화된 방식으로 다시 읽을 수 있습니다.
이 파일을 구문 분석하는 것은 상대적으로 간단하지만 GNU/linux 쉘로만 이와 같은 작업을 수행한 적이 없으며 이것이 가능한지 그리고 이를 위해 만들어진 도구의 이름을 알고 싶습니다.
편집하다
입력하다
START_BLOCK_2 opt1
color red
START_BLOCK_1 opt2
START_BLOCK_2 opt3
name Jon
START_BLOCK_2 opt4
color blu
END_BLOCK_1
예상 출력
opt1 red
opt3 opt2
opt3 Jon
opt4 opt2
opt4 blu
답변1
awk
예제 출력에 빈 줄을 원하지 않는다고 가정하는 솔루션 은 다음과 같습니다 .
awk '/START_BLOCK_1/ { block1=$2; next; } \
/END_BLOCK_1/ {block1=""; next; } \
/START_BLOCK_2/ { block2=$2; next; } \
/./ { if(block1) {print block2 " " block1} if(block2) { print block2 " " $2}
}' inp
각 줄의 시작 또는 끝 블록을 일치시켜 작동합니다. BLOCK_1에 "포함"되어 있으면 변수에 이름을 설정합니다 block1
. BLOCK_2에 "포함"되어 있으면 해당 이름을 변수에 설정합니다 block2
. 정의된 블록이 없고 비어 있지 않은(최소 1자 일치) 줄은 해당 블록에 따라 내용을 인쇄합니다.