문자열이 있습니다.
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
여기에서 문자열 대신 파이프를 사용할 수도 있습니다 .
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
줄 바꿈이 포함된 경우 각 줄의 두 번째/네 번째 필드 가 아닌 각 줄의 두 번째 / 네 번째 필드를 포함$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}"