구분 기호로 문자열을 나누고 N 번째 요소를 가져옵니다. A값 two과 변수에 B값 four위의 문자열에서

문자열이 있습니다.

one_two_three_four_five

나는 변수에 저장해야합니다 Atwo과 변수에 Bfour위의 문자열에서



답변

필드 구분 기호로 사용 cut하고 _원하는 필드를 얻으십시오.

A="$(cut -d'_' -f2 <<<'one_two_three_four_five')"
B="$(cut -d'_' -f4 <<<'one_two_three_four_five')"

echoHere 문자열 대신 및 파이프를 사용할 수도 있습니다 .

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}’`
… 등등 …