문자열을 구분 기호로 분할하고 N번째 요소 가져오기

문자열을 구분 기호로 분할하고 N번째 요소 가져오기

문자열이 있습니다.

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}"

관련 정보