이중 괄호 사이의 값 캡처

이중 괄호 사이의 값 캡처

내 파일에 데이터가 있습니다 {{1,department}}.

다음과 같은 값을 캡처해야 합니다.

val1=1
val2=department

단일 {}를 사용하여 데이터를 가져오기 위해 awk 명령을 사용해 보았더니 제대로 작동했습니다. 그러나 double {{}}의 경우 이 명령은 작동하지 않습니다.

내가 사용하는 명령은 다음과 같습니다

`var1=`echo $line | awk -F '[{}]' '{print $2}' | awk -F '[,]' '{print $1}'

답변1

GNU grep및 POSIX 셸 사용:

out=$(grep -Po '\{\{\K.*?(?=\}\})' < your-file)
val1=${out%%,*}
val2=${out#*,}
  • -P: 합계 연산자 grep로 Perl 호환 정규식을 사용하도록 지시합니다.\K(?=)
  • \K: 설정이 시작됩니다반품값. a\Kb일치 ab하지만 반환합니다 b. 따라서 여기서는 일치 {{...하지만 출력에서 ​​제외하기 위해 반환합니다 ....{{
  • (?=...)동일한 효과를 얻으려면 }}. ...일치하는 경우 너비가 0과 일치하지만 ...반환 값에는 포함되지 않는 예측 연산자입니다.
  • 그래서 $out결국에는 및 표준 쉘 연산자를 1,department사용하여 첫 번째 쉼표 앞뒤 부분을 추출합니다.${var%%pattern}${var#pattern}

파일에는 단 하나의 {{...}}항목과 최소한 하나의 쉼표가 포함되어 있다고 가정됩니다.

grepPOSIXly에서는 이 명령을 다음으로 바꿀 수 있습니다 .

sed -n 's/.*{{\([^}]*\)}}.*/\1/p'

이제 당신이 있다면

some text {{1,department}} other text

쉘 변수에서 다음을 사용하여 추출할 수도 있습니다.

  • zsh

    if [[ $string =~ '\{\{([^},]*),([^}]*)\}\}' ]]; then
      val1=$match[1] val2=$match[2]
    fi
    
  • bash

    if [[ $string =~ \{\{([^},]*),([^}]*)\}\} ]]; then
      val1=${BASH_REMATCH[1]} val2=${BASH_REMATCH[2]}
    fi
    

답변2

$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $3}'
department

$ echo "{{1,department}}" | awk -F "{{|}}|," '{print $2}'
1

답변3

다음을 사용하여 값(앞에 공백 포함)을 인쇄할 수 있습니다.

$ echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF'
 1 department

이렇게 하면 값을 읽을 수 있습니다.

read val1 val2 <<<$(echo "{{1,department}}" | awk -F '[ {},]' 'NF=NF')

이는 대괄호 및 기타 모든 필드에 적용됩니다.

$ echo "{{1,department,name,list}}" | awk -F '[ {},]' 'NF=NF'
 1 department name list

grep도 비슷한 솔루션을 제공할 수 있습니다.

$ echo '{1,department}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department

$ echo '{{1,department}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department

$ echo '{{1,department,name,list}}' | grep -Po '(?<={|,)[^{,}]*(?=,|})'
1
department
name
list

셸의 변수는 정확한 필드 수와 일치해야 합니다.

$ value='{{1,department}}'
$ re='\{\{([^},]*),([^}]*)\}\}'
$ [[ $value =~ $re ]] && echo "${BASH_REMATCH[@]:1}"
1 department

관련 정보