소개
이 튜토리얼은 Bash 에서 정규 표현식 (regex) 을 소개합니다. 정규 표현식은 텍스트 내에서 패턴을 찾는 강력한 도구입니다. 정규 표현식을 배우면 쉘 스크립팅 기술을 크게 향상시켜 텍스트 처리, 데이터 추출 및 작업을 보다 효과적으로 자동화할 수 있습니다. 이 튜토리얼은 초보자를 위해 설계되었으므로, 정규 표현식에 대한 사전 경험은 필요하지 않습니다. 기본적인 내용부터 시작하여 점차적으로 지식을 쌓아갈 것입니다.
이 튜토리얼은 Bash 에서 정규 표현식 (regex) 을 소개합니다. 정규 표현식은 텍스트 내에서 패턴을 찾는 강력한 도구입니다. 정규 표현식을 배우면 쉘 스크립팅 기술을 크게 향상시켜 텍스트 처리, 데이터 추출 및 작업을 보다 효과적으로 자동화할 수 있습니다. 이 튜토리얼은 초보자를 위해 설계되었으므로, 정규 표현식에 대한 사전 경험은 필요하지 않습니다. 기본적인 내용부터 시작하여 점차적으로 지식을 쌓아갈 것입니다.
정규 표현식의 기본적인 개념부터 시작해 보겠습니다. 정규 표현식은 검색 패턴을 정의하는 일련의 문자입니다. 텍스트를 검색하는 매우 강력한 방법이라고 생각하면 됩니다.
다음은 기본 구성 요소입니다.
abc는 정확히 "abc" 문자열과 일치합니다.. (마침표): 모든 단일 문자와 일치합니다 (줄 바꿈 제외). 따라서 a.c는 "abc", "axc", "a1c" 등과 일치합니다.* (별표): 선행 문자를 0 번 이상 일치시킵니다. ab*c는 "ac", "abc", "abbc", "abbbc" 등과 일치합니다.^ (캐럿): 줄의 시작 부분과 일치합니다. ^hello는 "hello"로 시작하는 줄과 일치합니다.$ (달러 기호): 줄의 끝 부분과 일치합니다. world$는 "world"로 끝나는 줄과 일치합니다.[] (대괄호): 문자 클래스를 정의합니다. 대괄호 안의 문자 중 하나와 일치합니다. [abc]는 "a", "b", 또는 "c"와 일치합니다. [0-9]는 모든 단일 숫자와 일치합니다.이제 이해도를 테스트하기 위해 Bash 스크립트를 만들어 보겠습니다. touch 명령을 사용하여 regex_test.sh라는 파일을 만듭니다.
cd ~/project
touch regex_test.sh
다음으로, 텍스트 편집기 (예: nano 또는 vim) 로 regex_test.sh를 열고 다음 코드를 추가합니다.
#!/bin/bash
string="Hello World"
if [[ "$string" =~ ^Hello ]]; then
echo "The string starts with Hello"
else
echo "The string does not start with Hello"
fi
파일을 저장하고 실행 가능하게 만듭니다.
chmod +x regex_test.sh
마지막으로, 스크립트를 실행합니다.
./regex_test.sh

출력은 문자열이 "Hello"로 시작함을 나타내야 합니다.
대괄호 []를 사용하여 정의된 문자 집합을 사용하면 특정 그룹의 문자 중 하나와 일치시킬 수 있습니다. 이는 더 유연한 패턴을 만드는 데 매우 유용합니다.
[] 내에서 하이픈 (-) 을 사용하여 범위를 지정할 수 있습니다. [a-z]는 모든 소문자와 일치하고, [A-Z]는 모든 대문자와 일치하며, [0-9]는 모든 숫자와 일치합니다. 이를 결합할 수 있습니다: [a-zA-Z0-9]는 모든 영숫자 문자와 일치합니다.[] 안의 첫 번째 문자로 ^를 넣으면 클래스를 부정합니다. [^0-9]는 숫자가 아닌 모든 문자와 일치합니다.regex_test.sh 스크립트를 수정하여 문자 집합을 사용해 보겠습니다. 텍스트 편집기로 regex_test.sh를 열고 내용을 다음으로 바꿉니다.
#!/bin/bash
string="cat"
if [[ "$string" =~ c[a-z]t ]]; then
echo "Match found!"
else
echo "No match."
fi
파일을 저장하고 실행합니다.
./regex_test.sh
출력은 "Match found!"를 나타내야 합니다. 이는 c[a-z]t가 'c'로 시작하고 't'로 끝나며 중간 문자가 소문자인 모든 세 글자 문자열과 일치하기 때문입니다.
수량자는 문자 또는 그룹이 반복되어야 하는 횟수를 제어합니다. 이는 정규 표현식 패턴에 상당한 힘을 더합니다.
+ (플러스): 선행 문자를 한 번 이상 일치시킵니다. ab+c는 "abc", "abbc", "abbbc" 등과 일치하지만 "ac"는 일치하지 않습니다.? (물음표): 선행 문자를 0 번 또는 1 번 일치시킵니다 (즉, 선행 문자를 선택 사항으로 만듭니다). ab?c는 "ac"와 "abc"와 일치하지만 "abbc"는 일치하지 않습니다.* (별표): 선행 문자를 0 번 이상 일치시킵니다. 앞서 보았습니다.{n}: 선행 문자를 정확히 n번 일치시킵니다. a{3}은 "aaa"와 일치합니다.{n,}: 선행 문자를 n 번 이상 일치시킵니다. a{2,}는 "aa", "aaa", "aaaa" 등과 일치합니다.{n,m}: 선행 문자를 n 번에서 m 번 사이 (포함) 일치시킵니다. a{1,3}은 "a", "aa", 또는 "aaa"와 일치합니다.regex_test.sh 스크립트를 수정하여 수량자를 사용해 보겠습니다. 텍스트 편집기로 regex_test.sh를 열고 내용을 다음으로 바꿉니다.
#!/bin/bash
string="abbbc"
if [[ "$string" =~ ab+c ]]; then
echo "Match found!"
else
echo "No match."
fi
파일을 저장하고 실행합니다.
./regex_test.sh
출력은 "Match found!"를 나타내야 합니다. 이는 ab+c가 'a'로 시작하고, 하나 이상의 'b'가 뒤따르며, 'c'로 끝나는 문자열과 일치하기 때문입니다.
괄호 ()는 정규 표현식의 일부를 그룹화하는 데 사용됩니다. 이는 여러 문자에 수량자를 적용하고 일치하는 텍스트를 캡처하는 데 유용합니다.
괄호를 사용하면 Bash 는 해당 정규 표현식 부분과 일치하는 텍스트를 BASH_REMATCH라는 특수 배열에 저장합니다. BASH_REMATCH[0]은 전체 일치 문자열을 포함하고, BASH_REMATCH[1]은 첫 번째 그룹과 일치하는 텍스트를 포함하며, BASH_REMATCH[2]는 두 번째 그룹과 일치하는 텍스트를 포함하는 식으로 진행됩니다.
regex_test.sh 스크립트를 수정하여 캡처 그룹을 사용하여 데이터를 추출해 보겠습니다. 텍스트 편집기로 regex_test.sh를 열고 내용을 다음으로 바꿉니다.
#!/bin/bash
string="apple123"
if [[ "$string" =~ ^([a-z]+)([0-9]+)$ ]]; then
fruit="${BASH_REMATCH[1]}"
number="${BASH_REMATCH[2]}"
echo "Fruit: $fruit"
else
echo "No match."
fi
파일을 저장하고 실행합니다.
./regex_test.sh
출력에는 "Fruit: apple"이 포함되어야 합니다. 이 스크립트는 캡처 그룹을 사용하여 문자열에서 과일 이름을 추출합니다.
sed를 사용하여 텍스트 바꾸기sed 사용을 연습하기 위해 sed_test.sh라는 새 스크립트를 만들어 보겠습니다.
cd ~/project
touch sed_test.sh
chmod +x sed_test.sh
텍스트 편집기로 sed_test.sh를 열고 다음을 추가합니다.
#!/bin/bash
string="apple123"
echo "$string" | sed 's/[0-9]/X/g'
파일을 저장하고 실행합니다.
./sed_test.sh
출력은 다음과 같아야 합니다: appleXXX. 이 스크립트는 sed를 사용하여 문자열의 모든 숫자를 문자 "X"로 바꿉니다.
이 튜토리얼에서는 Bash 에서 정규 표현식 (regex) 을 소개했습니다. 기본적인 정규 표현식 개념, 문자 클래스, 수량자 (quantifier), 그룹화, 캡처링 (capturing) 및 sed와 함께 정규 표현식을 사용하는 방법을 배웠습니다. Bash 스크립트를 작성하고 실행함으로써 이러한 강력한 도구에 대한 실질적인 경험을 얻었습니다. 이해를 굳건히 하기 위해 다양한 정규 표현식 패턴을 연습하고 실험하는 것을 잊지 마십시오.