Bash의 Case 문 내에서 정규식 실행

Abdullah Bukhari 2024년2월15일
  1. 정규식 소개
  2. Bash에서 복잡한 문자열 일치를 활성화해야 하는 필요성
  3. Case 구조에서 Regex를 사용한 문자열 일치
  4. If-Else 구조에서 Regex를 사용한 문자열 일치
Bash의 Case 문 내에서 정규식 실행

이 기사에서는 정규식, 기본 구문, Bash에서 case 구조 및 if-else 구조로 정규식을 실행하는 방법을 살펴봅니다.

정규식 소개

regex 또는 regexp라고도 하는 정규식은 텍스트/문자열 일치에 사용되는 일련의 문자입니다. 정규식은 매우 강력할 수 있으며 수많은 데이터를 구문 분석해야 할 때 많은 시간을 절약할 수 있습니다.

Bash는 regex를 사용하지 않지만 구문이 regex와 유사한 문자열 일치를 사용합니다. 아래 스크립트는 Bash와 문자열 일치의 기본 사항에 익숙해지는 데 도움이 됩니다.

?(a pattern list)
# Matches exactly zero or one instance of the pattern

*(a pattern list)
# This matches zero or more instances of the pattern.

+(a pattern list)
# This matches one or more instances of the pattern.

@(a pattern list)
# This matches one of the enclosed patterns.

!(a pattern list)
# This matches any pattern except the one enclosed.

위의 코드 펜스는 기본 regex 구문을 보여줍니다. regex에 대한 자세한 내용을 보려면 이 링크를 방문하십시오.

Bash에서 복잡한 문자열 일치를 활성화해야 하는 필요성

기본적으로 Bash에서 간단한 정규식을 실행할 수 있습니다. 복잡한 정규식은 extglob 옵션을 활성화해야 합니다. 아래 명령은 복잡한 정규 표현식을 실행할 수 있도록 extglob을 활성화 또는 비활성화하는 방법을 보여줍니다.

shopt -s extglob # this command enables extglob and allows the execution of complicated regex
shopt -u extglob # this command disables extglob and disables execution of complicated regex

위 명령에서 extglob은 확장된 글로빙을 나타냅니다. 설정된 경우 경로 이름 확장에 지정된 복합/고급 패턴 일치 기능이 허용됩니다.

정규식을 실행하지 않고는 정규식이 복잡한지 여부를 알 수 없다는 점에 유의해야 합니다. extglob 옵션을 활성화하여 불행을 피하고 걱정 없이 모든 명령을 실행하십시오.

한 가지 질문은 extglob이 켜져 있는지 꺼져 있는지 어떻게 알 수 있는지입니다. 참조를 위해 아래 명령을 참조하십시오.

shopt | grep extglob # displays status of extglob

출력:

extglob off # displays this line if extglob is disabled
extglob on # displays this line if extglob is enabled

bash에서 복합 문자열 일치 활성화

위의 명령은 extglob의 상태(켜짐 또는 꺼짐)를 표시합니다.

Case 구조에서 Regex를 사용한 문자열 일치

문자열 일치(regex와 유사)는 case 구조를 사용하여 훨씬 더 강력하게 만들 수 있으며, 이를 사용하여 더 복잡한 데이터를 구문 분석할 수 있습니다. 아래 명령은 Bash에서 case를 사용하여 작동합니다.

case EXPRESSION in
Match_1)
STATEMENTS # run this statement if in matches match_1
;;
Match_2)
STATEMENTS # run this statement if in matches match_2
;;
Match_N)
STATEMENTS # run this statement if in matches match_N
;;
*)
STATEMENTS # otherwise, run this statement
;;
Esac # signals the end of the case statement to the kernel

위의 코드는 case 구조와 일치하는 Bash 문자열을 결합하려는 경우에 사용할 일반 구문입니다.

Bash는 기본적으로 간단한 패턴 일치를 허용합니다. 예를 들어 아래 Bash 명령을 성공적으로 실행합니다.

cat sh*
# the above command displays the contents of all files whose name begins #with sh to the monitor (or stdout)

그러나 아래 명령(복잡한 패턴 일치 사용)이 주어지면 bash: 예기치 않은 토큰 '(' 근처의 구문 오류 오류가 발생합니다.

cat +([0-9]) # this command displays contents of files whose names are
# entirely composed of numbers

extglob 비활성화 시 오류

Bash에서 문자열 일치에 대해 자세히 알아보려면 아래 명령을 사용하십시오.

man bash # man is a short form of manual pages here

매뉴얼 페이지는 Bash 명령, 시스템 호출 등에 대한 정보를 찾는 데 사용할 수 있는 유틸리티입니다.

Bash에서 case와 일치하는 문자열을 사용하는 경우 먼저 패턴을 비교할 변수를 선언하고 정의하는 것이 좋습니다.

아래 명령 스니펫에서 문자열 일치와 함께 case를 사용했습니다. 강력한 문자열 일치 알고리즘을 생성하기 위해 문자열 일치의 기본 사항을 어떻게 사용했는지 확인하십시오.

명령을 살펴보겠습니다.

# Remember to not forget to enable extglob
shopt -s extglob # enables extglob
shopt | grep extglob # checks if extglob is enabled

some_variable="rs-123.host.com"; # declare and define variable
case $some_variable in
ab-+([0-9])\.host\.com) echo "First 2 characters were ab"
;;
ks-+([0-9])\.host\.com) echo "First 2 characters were ks"
;;
cs-+([0-9])\.host\.com) echo "First 2 characters were cs"
;;
*)echo "unknown first 2 characters"
;;
esac;
# the above command will display the unknown first 2 characters as we
# don't have a match in the first three cases, so the last default one will #automatically be true

출력:

unknown first 2 characters

위의 문자열 일치 명령어를 분석하면 처음 두 문자가 (ab, ks, cs) 중 하나이고 다음 문자가 하이픈(-) 뒤에 임의의 숫자와 끝이 오는 경우 .host.com을 사용하면 처음 세 가지 사례 중 하나가 성공하고 적절한 메시지가 표시됩니다.

그러나 그렇지 않은 경우 기본값(즉, 그렇지 않은 경우)이 실행되고 unknown first 2 characters 메시지가 표시됩니다.

위의 명령이 너무 복잡하다면 더 간단한 해결책이 있습니다. 아래 명령은 정확히 방법을 설명합니다.

some_variable="rs-123.host.com"; # declare and define variable
case $some_variable in
ab*.host.com) echo "First 2 characters were ab"
;;
# the command below stays the same

정규식을 사용한 문자열 일치

위의 명령은 위에서 사용한 더 복잡한 케이스 구조와 동일합니다.

If-Else 구조에서 Regex를 사용한 문자열 일치

강력한 문자열 일치 알고리즘을 코딩하는 또 다른 방법은 if-else 구조와 함께 사용하는 것입니다. 이를 사용하여 더 복잡한 데이터를 구문 분석할 수 있습니다.

다음 Bash 명령은 if-else 구조의 구문을 안내합니다.

if expression1
then
task1
elif expression2
then
task2
else
task3
fi # signals ending of if else structure

if-else 구조 작업은 쉽습니다. 먼저 첫 번째 표현식을 평가합니다.

그것이 true이면 task 1을 실행합니다. 그렇지 않으면 두 번째 표현을 고려합니다.

그것이 true이면 task 2를 실행하십시오. 그렇지 않으면 task3을 실행하십시오.

이제 if-else 구조의 구문에 익숙해졌으므로 case 구조에 사용된 명령을 동등한 if-else 구조로 복제해 보겠습니다. 그렇게 하려면 아래 명령을 참조하십시오.

# Remember to not forget to enable extglob
shopt -s extglob # enables extglob
shopt | grep extglob # checks if extglob is enabled

some_variable="rs-123.host.com"; # declare and define variable
if expr "$some_variable" : ‘ab-+([0-9])\.host\.com’ >/dev/null; then echo "First 2 characters were ab"
elif expr "$some_variable" : ‘ks-+([0-9])\.host\.com’ >/dev/null; then echo "First 2 characters were ks"
elif expr "$some_variable" : ‘cs-+([0-9])\.host\.com’ >/dev/null; then echo "First 2 characters were cs"
else echo "unknown first 2 characters"
fi

# the above command will display the unknown first 2 characters as we
# don't have a match in the first three cases, so the last default one will #automatically be true

출력:

unknown first 2 characters

if else에서 정규식을 사용한 문자열 일치

위의 명령은 이전에 사용한 case 구조와 동등한 if-else입니다.

관련 문장 - Bash Regex