Bash에서 문자열을 변수로 분할

Abdul Mateen 2023년6월20일
  1. Bash의 문자열
  2. Bash의 문자열 함수
  3. Bash에서 문자열을 변수로 분할
  4. cut 명령을 사용하여 Bash에서 문자열을 변수로 분할
  5. IFS(Internal Field Separator)를 사용하여 Bash에서 문자열을 변수로 분할
  6. readsed와 함께 사용하여 Bash에서 문자열을 변수로 분할
  7. Bash에서 정규 표현식을 사용하여 문자열을 변수로 분할
Bash에서 문자열을 변수로 분할

이 튜토리얼에서는 Bash에서 문자열을 변수로 분할하는 다양한 방법에 대해 설명합니다.

문자열에 대한 간략한 소개로 토론을 시작하겠습니다. 나중에 Bash 예제를 사용하여 문자열을 분할하는 다양한 방법에 대해 설명합니다.

Bash의 문자열

문자열은 문자의 조합/모음입니다. Bash에서 문자열은 정수 또는 실수와 같은 데이터 유형입니다.

문자에는 숫자도 포함될 수 있습니다. 문자열 내부의 숫자는 일련의 ASCII 문자로 표시되기 때문입니다.

정수 또는 실수와 같은 데이터 유형에서 숫자는 완전한 엔터티입니다. 숫자의 개별적인 존재는 없습니다. 그러나 문자열에서 문자열 내부의 모든 문자(공백, 쉼표, 세미콜론 및 콜론 포함)에는 고유한 표현이 있습니다.

조합하여 개별 문자는 완전한 문자열을 나타냅니다. 키보드에서 입력할 수 있는 모든 문자는 문자열의 일부가 될 수 있습니다.

예를 들어:

s1="Welcome"
s2="This is a complete sentence and string as well"
s3="The string, has some special charactrs like ,$%^[]"
s4="The population of country ABC is 12345678"

여기서 첫 번째 문자열에는 알파벳만 있습니다. 다음 문자열(예: s2)에도 공백이 있습니다. 이러한 공백은 문자열의 일부이며 알파벳처럼 저장됩니다.

따라서 두 번째 문자열에는 8개의 공백이 있으며 메모리에서 8바이트를 차지합니다.

세 번째 문자열에는 다시 문자열의 일부인 특수 문자가 있습니다.

마지막으로 네 번째 문자열에는 숫자가 아니라 숫자의 조합인 숫자가 있습니다. 숫자로 계산/비교를 하고 싶다면 어떤 메커니즘을 통해 숫자로 변환하지 않으면 불가능합니다.

Bash의 문자열 함수

정수 또는 부동 소수점 숫자에 대한 산술 연산과 마찬가지로 특정 연산/함수는 문자열로 가능/사용 가능합니다.

예를 들어 두 문자열이 같은지 비교할 수 있습니다(문자열 또는 하위 문자열을 찾아야 하는 경우 같음 연산이 필요함). Bash 스크립트는 다음과 같습니다.

s1="World Cup."
s2="World Cup"

if [ "$s1" = "$s2" ]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

s3="World Cup."

if [ "$s1" = "$s3" ];  then
    echo "Both the strings are equal."
else
    echo "Strings are not equal."
fi

여기에는 똑같이 보이는 두 개의 문자열이 있습니다. 그러나 첫 번째 문자열 끝에 있는 점에 차이가 있습니다.

위의 스크립트는 먼저 if 문을 사용하여 두 문자열을 비교합니다. 여기서 문자열 변수는 큰따옴표로 묶고 단일 등호를 사용하여 비교합니다.

다음으로 첫 번째 문자열과 동일한 또 다른 문자열 s3을 선언하고 다시 비교를 수행합니다. 이 스크립트의 출력은 다음과 같습니다.

Strings are not equal.
Both the strings are equal.

해시 기호를 사용하여 문자열의 길이를 찾을 수 있습니다. Bash 스크립트는 다음과 같습니다.

s=abcAXYZ123456_AaBbCc
echo "Length of " $s " is:" ${#s}

이 스크립트의 출력은 다음과 같습니다.

Length of abcAXYZ123456_AaBbCc is: 20

정규식을 사용하여 하위 문자열의 길이를 비교하고 가져올 수 있습니다(정규식에 대해 자세히 다루지 않습니다. 여기에서 정규식에 대해 읽을 수 있습니다).

다음은 정규식을 사용하여 일치시키는 코드입니다.

s=abcAXYZ123456_AaBbCc
echo `expr match "$s" 'abc[A-Z]*.2'`
echo `expr "$s" : 'abc[A-Z]*.[0-9]*_'`

첫 번째 일치에서 작은 abc, 대문자 알파벳(0 이상), 숫자 2를 찾습니다.

두 번째 경기는 약간 다른 방식을 사용합니다. 그럼에도 불구하고 정규식을 사용하여 밑줄로 닫힌 하위 문자열을 일치시킵니다.

위 스크립트의 출력은 다음과 같습니다.

9
14

첫 번째 일치에서 숫자 2는 위치 9에 오고 두 번째 일치에서 밑줄은 위치 14에 옵니다. 문자열에서 가능한 작업/함수의 긴 목록이 있습니다.

첫 번째 일치에서 숫자 2는 위치 9에 옵니다. 두 번째 일치에서 밑줄은 위치 14에 옵니다.

그러나 우리는 문자열 분할이라는 주요 주제로 이동하고 있습니다.

Bash에서 문자열을 변수로 분할

문자열을 문자 또는 하위 문자열로 분할하는 것은 일반적이고 자주 사용되는 작업입니다. 예를 들어 식을 평가하기 전에 변수와 연산자(토큰이라고 함)로 분할해야 합니다.

번역 단계를 시작하기 전에 컴파일러 또는 기타 언어 번역기는 어휘 분석기를 사용하여 프로그램, 문자열을 변수, 키워드, 블록, 함수 등으로 분석하고 분할합니다. 자연어 처리에서 기사를 문장, 단어, 동사, 명사 등이 필요합니다.

Bash에는 문자열을 분할하는 다양한 방법이 있습니다. 예를 들어 논의하겠습니다.

cut 명령을 사용하여 Bash에서 문자열을 변수로 분할

Bash에서는 잘라내기 작업을 사용하여 문자열을 분할할 수 있습니다. cut 명령의 구문은 다음과 같습니다.

cut -f(number) -d(delimiter)

cut 명령은 -d 옵션 뒤에 제공된 구분 기호를 기준으로 문자열을 분할합니다. 문자열의 구분 기호는 두 개의 하위 문자열을 구분하는(또는 구분하는 것으로 간주되는) 모든 문자가 될 수 있습니다.

예를 들어, 영어에서는 문장이 점으로 구분됩니다. 따라서 마침표는 문장을 구분하는 구분 기호로 간주할 수 있습니다. 마찬가지로 공백은 단어를 구분하는 구분 기호입니다.

연산자는 산술식(프로그래밍에서)에서 피연산자 사이의 구분 기호입니다.

다음으로 하이픈을 구분 기호로 사용하는 문자열이 있는 스크립트가 있습니다. 문자열은 세 개의 변수로 분할됩니다.

변수를 처음 사용할 때는 달러 기호가 필요하지 않습니다. 그러나 후속 작업에는 변수가 있는 달러 기호가 필요합니다. 스크립트는 다음과 같습니다.

v="0123-456-789"
v1=$(echo $v | cut -f1 -d-)
v2=$(echo $v | cut -f2 -d-)
v3=$(echo $v | cut -f3 -d-)
echo $v1
echo $v2
echo $v3

이 스크립트의 출력은 다음과 같습니다.

0123
456
789

아이디어를 제공하기 위해 잘라내기 작업과 함께 다른 구분 기호를 사용할 것입니다. 콜론을 구분 기호로 사용하는 또 다른 스크립트는 다음과 같습니다.

v="0123:456:789"
v1=$(echo $v | cut -f1 -d:)
v2=$(echo $v | cut -f2 -d:)
v3=$(echo $v | cut -f3 -d:)
echo $v1
echo $v2
echo $v3

구분 기호를 제외하고 코드는 동일합니다. 콜론은 문자열의 구분 기호입니다. 잘라내기 작업에서도 동일하게 사용됩니다.

이 스크립트의 출력은 다음과 같습니다.

0123
456
789

잘라내기 작업에는 단일 구분 기호 옵션이 있습니다. 그러나 내부 필드 구분 기호를 사용하면 여러 구분 기호를 사용할 수 있습니다.

IFS(Internal Field Separator)를 사용하여 Bash에서 문자열을 변수로 분할

IFS를 사용하면 단일 또는 다중 구분 기호를 사용할 수 있습니다. 단일 구분 기호의 경우 따옴표가 필요하지 않습니다. 그러나 다양한 구분 기호를 사용하려면 큰따옴표에 둘 이상의 구분 문자를 포함할 수 있습니다.

매우 기본적인 예를 살펴보겠습니다.

IFS=- read v1 v2 v3 v4 <<< this-is-batch-file
echo $v1
echo $v2
echo $v3
echo $v4

위의 스크립트에서 IFS에는 단일 구분 기호만 있습니다. IFS를 사용하여 문자열 this-is-batch-file을 변수 v1에서 v4로 할당하는 것을 읽습니다.

이 스크립트의 출력은 다음과 같습니다.

this
is
batch
file

다음으로 여러 구분 기호의 예가 있습니다. 다음 스크립트를 참조하십시오.

IFS=" ,: " read v1 v2 v3 v4 <<< is,something,strange:there
echo $v1
echo $v2
echo $v3
echo $v4

여기서는 IFS에서 2개의 구분자를 사용하며 문자열에도 2개의 구분자를 포함한다. 처음 세 단어는 쉼표를 사용하여 구분하고 마지막 단어는 콜론을 사용하여 구분합니다.

출력은 다음과 같습니다.

is
something
strange
there

이제 IFS를 사용하여 여러 구분 기호 옵션이 있습니다.

문자열을 분할하기 위해 항상 구분 기호를 제공해야 합니까? 내 대답은 아니오 야; 다른 방법도 있습니다.

readsed와 함께 사용하여 Bash에서 문자열을 변수로 분할

readsed(행별로 많은 문자열 작업을 수행할 수 있는 특수 명령)를 사용하여 문자열을 문자 배열로 분할할 수 있습니다. 따라서 문자 배열이 있으면 특정 요구 사항에 따라 조작할 수 있습니다.

스크립트는 다음과 같습니다.

read -ra var5 <<<"$(echo "12-34-56" | sed 's/./& /g')"
echo ${var5[0]}
echo ${var5[1]}
echo ${var5[2]}
echo ${var5[3]}

이 스크립트의 출력은 다음과 같습니다.

1
2
-
3

하이픈 문자도 문자로 배치됩니다. 따라서 이 메서드는 구분 기호에서 문자열을 분할할 수 없습니다. 대신 문자열을 문자 배열로 나눕니다.

이 방법에는 한 가지 예외가 있습니다. 문자 사이에 공백을 사용하면 프로세스가 공백을 무시하고 결과 배열에 공백이 없습니다.

다음 스크립트와 인접한 출력을 사용하여 이를 이해해 보겠습니다.

read -ra var51 <<<"$(echo "FG HI JK" | sed 's/./& /g')"
echo ${var51[0]}
echo ${var51[1]}
echo ${var51[2]}
echo ${var51[3]}

출력은 다음과 같습니다.

F
G
H
I

출력에서 아래 첨자/색인 2에 공백 문자 대신 문자 H가 포함되어 있음이 분명합니다.

Bash에서 정규 표현식을 사용하여 문자열을 변수로 분할

정규 표현식에 대해 읽을 수 있는 링크를 이미 공유했습니다. 여기에 정규 표현식을 사용하고 =~를 사용하여 일치 작업을 사용하여 문자열을 분할하는 또 다른 방법이 있습니다.

스크립트는 다음과 같습니다.

re="^([^-]+)-(.*)$"
[[ "31-28-31" =~ $re ]] && var6="${BASH_REMATCH[1]}" && var_r="${BASH_REMATCH[2]}"
[[ $var_r =~ $re ]] && var7="${BASH_REMATCH[1]}" && var8="${BASH_REMATCH[2]}"
echo "First:" $var6
echo "Second:" $var7
echo "Third:" $var8

다시 하이픈은 구분 기호로 사용되며 정규식에는 하이픈이 포함됩니다. 출력은 다음과 같습니다.

First: 31
Second: 28
Third: 31

다음으로 구분 기호 쉼표가 다른 동일한 방법이 있습니다. 스크립트는 다음과 같습니다.

re1="^([^,]+),(.*)$"
[[ "high,risk" =~ $re1 ]] && v1="${BASH_REMATCH[1]}" && v2="${BASH_REMATCH[2]}"
echo "First:" $v1
echo "Second:" $v2

출력은 다음과 같습니다.

First: high
Second: risk

마지막으로 Bash에서 문자열을 분할하고 변수에 저장하는 다양한 방법을 제시했습니다. 이제 독자는 자신의 요구 사항에 잘 맞는 방법을 사용할 수 있습니다.

관련 문장 - Bash String