
문자열이 있습니다.
one_two_three_four_five
위 문자열의 변수 A
값 two
과 변수 B
값을 저장해야 합니다.four
ksh를 사용하고 있습니다.
답변1
필드 구분 기호로 cut
with를 사용 하고 원하는 필드를 가져옵니다._
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
에 개행 문자가 포함되어 있으면 의 2 번째 /4 번째 필드 가 아니라 의 각 줄에 2 번째 /4 번째$s
필드 를 포함하는 여러 줄 문자열이 반환된다는 점에 유의하세요 .$s
$s
답변2
답변 을 보고 싶었 awk
으므로 다음과 같습니다.
A=$(awk -F_ '{print $2}' <<< 'one_two_three_four_five')
B=$(awk -F_ '{print $4}' <<< 'one_two_three_four_five')
답변3
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
답변4
zsh
문자열(on _
)을 배열로 분할할 수 있습니다 .
non_empty_elements=(${(s:_:)string})
all_elements=("${(@s:_:)string}")
그런 다음 배열 인덱스를 통해 각 요소에 액세스합니다.
print -r -- ${all_elements[4]}
(대부분 의 zsh
다른 쉘과 비슷하지만 ksh
/ 와는 다름 bash
)배열 인덱스는 1부터 시작.
또는 하나의 확장에서 직접:
print -r -- "${${(@s:_:)string}[4]}"
$1
또는 해당 요소에 대해 익명 함수를 사용하여 , $2
... 에서 사용할 수 있습니다 .
(){print -r -- $4} "${(@s:_:)string}"