시작 부분과 끝 부분을 확인하세요.

시작 부분과 끝 부분을 확인하세요.

TITLE내 파일에는 oy 와 SUBTITLE쉼표 구분 기호가 포함된 시작 섹션으로 정의된 섹션이 포함되어 있습니다 KEYWORD.

## TITLE [SUBTITLE] KEYWORD,KEYWORD  

엔딩은 다음을 사용하여 완성됩니다.

## END OF TITLE [SUBTITLE]

파일에 정의의 해당 끝이 포함되어 있는지 확인하고 싶습니다.

파일에 필요한 내용이 있는지 확인하기 위해 테스트를 실행하려면 어떻게 해야 합니까? Bash에서 이것을 테스트해야합니다.

## FAML [ASMB] keyword,keyword  

## Some text
## Description
## END OF FAML [ASMB]

Some Code

## More text

## FALUN [GONG] keyword,keyword  

## Some text
## Description
## END OF FALUN [GONG]

More Text

아래부터 해당 부분의 실제 문자열을 캡쳐합니다.

while read line; do
  if [[ $line =~ ^##\ ([A-Z]+)\ \[([A-Z]+)\]\ (.*),(.*)$ ]]; then
    title=${BASH_REMATCH[1]}
    subtitle=${BASH_REMATCH[2]}
    keywords=${BASH_REMATCH[3]}
    keywords2=${BASH_REMATCH[4]}
    echo "Title: $title"
    echo "Subtitle: $subtitle"
    echo "Keywords: $keywords, $keywords2"
  fi
done < input.txt

다음 코드를 실행해 보았으나 print가 키워드가 아니고 배열 인쇄가 발생하지 않습니다.

  ## DN [AMBIT] bash,resource
  ##   hodeuiihoedu
  ##   AVAL:
  ##   + ooeueocu
  ## END OF DN [AMBIT]

답변1

원하는 수의 키워드를 읽으려면 정규식을 변경하여 텍스트 뒤에 선택적 쉼표가 오는 패턴을 찾으세요. 키워드의 전체 목록은 단일 변수로 캡처됩니다. 그런 다음 쉼표로 구분된 목록을 배열로 읽어옵니다.

while read -r line; do
    if [[ $line =~ ^##\ ([A-Z]+)\ \[([A-Z]+)\]\ (.*[,]?)$ ]]; then
        title="${BASH_REMATCH[1]}"
        subtitle="${BASH_REMATCH[2]}"
        echo "Title: $title"
        echo "Subtitle: $subtitle"

        # read keyword list into array
        IFS=',' read -ra keywords <<< "${BASH_REMATCH[3]}"
        i=0
        for kw in "${keywords[@]}"; do
            echo "Keyword$((i+=1)): $kw"
        done
        echo
    fi
done << EOF

## FAML [ASMB] keyword1,keyword2  

## Some text
## Description
## END OF FAML [ASMB]

Some Code

## More text

## FALUN [GONG] keyword1,keyword2,keyword3,keyword4

## Some text
## Description
## END OF FALUN [GONG]
EOF

산출:

Title: FAML
Subtitle: ASMB
Keyword1: keyword1
Keyword2: keyword2

Title: FALUN
Subtitle: GONG
Keyword1: keyword1
Keyword2: keyword2
Keyword3: keyword3
Keyword4: keyword4

관련 정보