IFS 변수와 정규식을 사용하여 Bash 문자열 분할

IFS 변수와 정규식을 사용하여 Bash 문자열 분할

문자열을 임의의 문자로 배열로 분할하려고 합니다.아니요문자와 숫자. 이 작업을 수행하기 위해 정규식 패턴을 IFS 변수에 할당할 수 있습니까?

나는 다음과 같은 것을 시도했습니다 :

input="$1"

IFS="[^a-zA-Z]"
read -ra name_parts <<< "$input"

그러나 이렇게 하면 문자열이 "a" 또는 "A"로 분할됩니다. "^"도 인식하지 못합니다. 이 문제제목은 비슷해 보이지만 제가 묻는 질문과 관련이 없는 것 같습니다.

답변1

IFS이대로는 사용할 수 없습니다. 물론아니요정규식을 사용하십시오. 최소한 구성 문자(리터럴 문자)는 IFS쉘에서 단어를 확장할 때 단어를 분할하는 데 사용됩니다. 예를 들어

IFS=: read -r v1 v2 <<<"foo:bar"

정의한 내용은 IFS="[^a-zA-Z]"문자 그대로 문자(예: 각 , , , , )를 허용하며 입력 문자열을 분할 하기 위한 구분 기호 [로 사용됩니다 . 이는 분명히 예상한 것과는 다릅니다.^a-zAZ]

답변2

IFS정규 표현식이 아닌 문자 묶음(또는 바이트)입니다. 그러나 awk 또는 sed를 사용하여 정규식을 기반으로 문자열을 분할하고 더 간단한 구분 기호를 사용하여 인쇄한 다음 셸의 read.

read -ra name_parts < <(awk -vFS='[^a-zA-Z]' -vOFS=' ' '{$1=$1; print}' <<< "$input")

또는

read -ra name_parts < <(sed -e 's/[^a-zA-Z]/ /g' <<< "$input")

답변3

IFS수정하는 대신 입력 문자열을 매핑한 다음 기본 IFS를 사용하여 분할하는 것이 더 좋습니다.

read -ra name_parts <<<"$(printf '%s\n' "$input" | LC_ALL=C tr -cs 'a-zA-Z\n'  '[ *]')"

배열 이름 _parts는 이제 문자가 아닌 위치에서 슬라이스된 문자열을 보유합니다.

관련 정보