쉘 스크립트를 사용하여 매우 간단한 마크업 구문 분석

쉘 스크립트를 사용하여 매우 간단한 마크업 구문 분석

매우 간단한 구문을 가진 구성 파일인 파일을 구문 분석해야 합니다. 두 가지 유형의 여러 줄 블록과 인라인 태그가 있습니다.

유형 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자 일치) 줄은 해당 블록에 따라 내용을 인쇄합니다.

관련 정보