문자열이 있습니다.
one_two_three_four_five
나는 변수에 저장해야합니다 A
값 two
과 변수에 B
값 four
위의 문자열에서
답변
필드 구분 기호로 사용 cut
하고 _
원하는 필드를 얻으십시오.
A="$(cut -d'_' -f2 <<<'one_two_three_four_five')"
B="$(cut -d'_' -f4 <<<'one_two_three_four_five')"
echo
Here 문자열 대신 및 파이프를 사용할 수도 있습니다 .
A="$(echo 'one_two_three_four_five' | cut -d'_' -f2)"
B="$(echo 'one_two_three_four_five' | cut -d'_' -f4)"
예:
$ s='one_two_three_four_five'
$ A="$(cut -d'_' -f2 <<<"$s")"
$ echo "$A"
two
$ B="$(cut -d'_' -f4 <<<"$s")"
$ echo "$B"
four
답변
POSIX sh 구문 만 사용하면 매개 변수 대체 구문 을 사용 하여 한 번에 하나의 구분자를 구문 분석 할 수 있습니다 . 이 코드는 필요한 수의 필드가 있다고 가정하고 그렇지 않으면 마지막 필드가 반복됩니다.
string='one_two_three_four_five'
remainder="$string"
first="${remainder%%_*}"; remainder="${remainder#*_}"
second="${remainder%%_*}"; remainder="${remainder#*_}"
third="${remainder%%_*}"; remainder="${remainder#*_}"
fourth="${remainder%%_*}"; remainder="${remainder#*_}"
또는 와일드 카드 확장을 사용하지 IFS
않고 분리 문자로 설정 한 인용 부호없는 매개 변수 대체를 사용할 수 있습니다 (구분자가 공백이 아닌 단일 문자이거나 공백 시퀀스가 분리 문자 인 경우에만 작동 함).
string='one_two_three_four_five'
set -f; IFS='_'
set -- $string
second=$2; fourth=$4
set +f; unset IFS
이 위치 매개 변수를 방해합니다. 함수에서이 작업을 수행하면 함수의 위치 매개 변수 만 영향을받습니다.
또 다른 방법은 read
내장 을 사용하는 것 입니다.
IFS=_ read -r first second third fourth trail <<'EOF'
one_two_three_four_five
EOF
답변
awk
답을 찾고 싶었 으므로 여기에 하나가 있습니다.
A=$(awk -F_ '{print $2}' <<< 'one_two_three_four_five')
B=$(awk -F_ '{print $4}' <<< 'one_two_three_four_five')
답변
가장 간단한 방법 (<<<이있는 쉘의 경우)은 다음과 같습니다.
IFS='_' read -r a second a fourth a <<<"$string"
하나의 쉘이 불평하기 때문에 $a
대신 임시 변수 를 사용합니다 $_
.
전체 스크립트에서 :
string='one_two_three_four_five'
IFS='_' read -r a second a fourth a <<<"$string"
echo "$second $fourth"
IFS 변경 없음, set -f
(경로 확장) 문제 없음 위치 매개 변수 변경 없음 ( “$ @”).
용액을 휴대용 들어 모든 IFS 변화없이 셸 (예, 모든 POSIX 포함) 또는 set -f
상기 (좀더 복잡한) 히어 닥 당량을 사용
string='one_two_three_four_five'
IFS='_' read -r a second a fourth a <<-_EOF_
$string
_EOF_
echo "$second $fourth"
이 솔루션 (여기서는이 문서와 사용법을 사용 <<<
하면 후행 줄 바꿈이 모두 제거 될 것입니다.
이는 “한
줄짜리 “가변 컨텐츠로 설계되어 있습니다.
bash 버전 4.4에서 매우 간단한 해결책이 가능합니다
readarray -d _ -t arr <<<"$string"
echo "array ${arr[1]} ${arr[3]}" # array numbers are zero based.
많은 POSIX 셸에 배열이 없기 때문에 POSIX 셸에는 해당 사항이 없습니다.
배열이있는 쉘의 경우 다음과 같이 간단 할 수 있습니다
(attsh, lksh, mksh, ksh 및 bash에서 작동 테스트)
set -f; IFS=_; arr=($string)
그러나 변수와 옵션을 유지하고 재설정하기위한 추가 배관이 많이 있습니다.
string='one_* *_three_four_five'
case $- in
*f*) noglobset=true; ;;
*) noglobset=false;;
esac
oldIFS="$IFS"
set -f; IFS=_; arr=($string)
if $noglobset; then set -f; else set +f; fi
echo "two=${arr[1]} four=${arr[3]}"
zsh에서 배열은 1로 시작하며 기본적으로 문자열을 분할하지 않습니다.
따라서 zsh에서이 작업을 수행하려면 일부 변경이 필요합니다.
답변
와 zsh
당신 (의 문자열을 나눌 수있는 _
배열로) :
elements=(${(s:_:)string})
그런 다음 배열 색인을 통해 각 요소에 액세스하십시오.
print -r ${elements[4]}
에 있다는 사실을 양지해야합니다 zsh
(달리 ksh
/ bash
) 배열 인덱스는 1에서 시작합니다 .
답변
파이썬 솔루션이 허용됩니까?
# python -c "import sys; print sys.argv[1].split('_')[1]" one_two_three_four_five
two
# python -c "import sys; print sys.argv[1].split('_')[3]" one_two_three_four_five
four
답변
또 다른 awk 예제; 이해하기 간단합니다.
A=\`echo one_two_three_four_five | awk -F_ '{print $1}'\`
B=\`echo one_two_three_four_five | awk -F_ '{print $2}'\`
C=\`echo one_two_three_four_five | awk -F_ '{print $3}'\`
... and so on...
변수와 함께 사용할 수도 있습니다. 다음과 같이
가정하십시오.
this_str = “one_two_three_four_five”
그러면 다음과 같이 작동합니다.
A =`echo $ {this_str} | awk -F_ ‘{print $ 1}’`
B =`echo $ {this_str} | awk -F_ ‘{print $ 2}’`
C =`echo $ {this_str} | awk -F_ ‘{print $ 3}’`
… 등등 …