내 파일에 데이터가 있습니다 {{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}
파일에는 단 하나의 {{...}}
항목과 최소한 하나의 쉼표가 포함되어 있다고 가정됩니다.
grep
POSIXly에서는 이 명령을 다음으로 바꿀 수 있습니다 .
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