정규 표현식 소개

소개

시스템 관리자, 개발자, QA 엔지니어, 지원 엔지니어 등은 파일에서 특정한 패턴을 찾아야 할 때가 있습니다. 예를 들어 특정 범위에 속하는 IP 주소 집합이나 시간 스탬프 범위 또는 도메인 또는 서브도메인 이름 그룹 등을 찾을 수 있습니다. 또한 특정한 방식으로 철자가 지정된 단어를 찾거나 파일에서 가능한 오타를 찾아야 할 수도 있습니다. 여기서 정규 표현식이 필요합니다.

정규 표현식은 패턴을 일치시키는(때로는 패턴을 일치시키지 않는) 템플릿입니다. 텍스트를 설명하고 구문 분석하는 방법을 제공합니다. 이 튜토리얼에서는 특정 언어의 세부 사항에 대해 다루지 않고 개념을 설명하기 위해 egrep을 사용할 것입니다.

정규 표현식

정규 표현식은 두 종류의 문자로 구성됩니다:

  • 일반 리터럴 문자와

  • 메타 문자

이러한 메타 문자는 정규 표현식에 전력을 부여합니다.

다음과 같은 country.txt 파일을 고려해 보겠습니다. 첫 번째 열은 국가 이름이고, 두 번째 열은 국가의 인구이며, 세 번째 열은 대륙입니다.

$ cat country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Argentina,36955182,Latin America
Brazil,172860370,Latin America
Cameroon,15421937,Africa
Japan,126549976,Asia

앵커 메타 문자

우리가 먼저 논의할 “메타 문자” 그룹은 ^$입니다. ^$는 각각 패턴의 시작과 끝을 일치시키며 앵커 메타 문자라고 합니다.

국가 이름이 I로 시작하는 모든 국가의 이름을 찾으려면 다음 표현식을 사용합니다:

$ egrep '^I' country.txt
India,1014003817,Asia
Italy,57634327,Europe

또는 대륙 이름이 e로 끝나는 모든 국가를 찾으려면 다음과 같이 합니다:

$ egrep 'e$' country.txt
Italy,57634327,Europe

다음 메타 문자는 점(.)으로, 모든 한 문자와 일치합니다. 국가 이름이 정확히 5자인 모든 행을 일치시키려면:

$ egrep '^.....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Yemen,1184300,Asia
Japan,126549976,Asia

I 또는 J로 시작하는 국가 이름이고 국가 이름이 5자인 모든 행을 찾는 방법은 어떻습니까?

$ egrep '^[IJ]....,' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

[…]은 문자 집합 또는 문자 클래스라고합니다. 문자 집합 내에서는 주어진 문자 중 하나만 일치합니다.

문자 집합 내에서 ^는 문자 집합을 부정합니다. 다음 예제는 I 또는 J로 시작하지 않지만 5자로 된 국가 이름을 일치시킵니다.

$ egrep '^[^IJ]....,' country.txt
Yemen,1184300,Asia

그룹화 메타 문자와 대안

아시아 또는 아프리카를 포함하는 모든 라인을 일치시키려면:

$ egrep 'Asia|Africa' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

이것은 또한 Aa를 공통으로 취하는 것으로 수행할 수 있습니다.

$ egrep 'A(si|fric)a' country.txt
India,1014003817,Asia
Yemen,1184300,Asia
Cameroon,15421937,Africa
Japan,126549976,Asia

수량자

다음을 쓰는 대신에

$ egrep '^[IJ]....,' country.txt

우리는 다음과 같이 쓸 수 있습니다.

$ egrep '^[IJ].{4},' country.txt

여기서 {}는 수량자로 불립니다. 그들은 그들 앞에 있는 문자가 몇 번 나타나야 하는지를 결정합니다.

우리는 범위를 줄 수도 있습니다:

$ egrep '^[IJ].{4,6},' country.txt
India,1014003817,Asia
Italy,57634327,Europe
Japan,126549976,Asia

이것은 I 또는 J로 시작하고 그 뒤에 4에서 6개의 문자를 가진 국가 이름과 일치합니다.

수량자에 대한 몇 가지 바로 가기가 있습니다. 예를 들어,

{0,1}은 ?와 동일합니다.

$ egrep '^ab{0,1}c$' filename

다음과 같습니다:

$ egrep '^ab?c' filename

{0,}는 *와 동일합니다.

$ egrep '^ab{0,}c$' filename

다음과 같습니다:

$ egrep '^ab*c' filename

{1,}은 +와 동일합니다.

$ egrep '^ab{1,}c$' filename

다음과 같습니다:

$ egrep '^ab+c' filename

지금까지 본 표현을 사용한 몇 가지 예제를 살펴보겠습니다. 여기서는 파일에서 검색하는 대신 표준 입력에서 검색합니다. 우리가 사용하는 트릭은 grep(또는 egrep)가 패턴을 검색하고 패턴이 발견되면 패턴을 포함하는 전체 라인이 표시된다는 것을 알고 있다는 것입니다.

우리는 문장 the grey colour suit was his favourite의 모든 가능한 철자를 찾고 싶습니다.

이 표현은 다음과 같습니다:

$ egrep 'the gr[ea]y colou?r suit was his favou?rite'
the grey color suit was his favourite
the grey color suit was his favourite

the gray colour suit was his favorite
the gray colour suit was his favorite

위의 표현을 보면 다음을 알 수 있습니다:

  • grey는 grey 또는 gray로 쓸 수 있습니다

  • colour는 colour 또는 color로 쓰여질 수 있으며, 이는 u가 선택 사항이므로 u?를 사용합니다

  • 비슷하게 favourite 또는 favorite는 favou?rite로 쓰일 수 있습니다

미국 우편 번호를 매칭하는 방법은 어떻게 될까요?

$ egrep '^[0-9]{5}(-[0-9]{4})?$'
83456
83456

83456-

834562

92456-1234
92456-1234

10344-2342-345

24시간 시계에서 모든 유효한 시간을 매칭하는 더 많은 예시입니다.

$ egrep '^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]'
23:44:02
23:44:02

33:45:11

15:45:33
15:45:33

위의 예에서 우리는 시간의 첫 번째 숫자가 0 또는 1이면 두 번째 숫자가 0에서 9까지일 것이라고 말했습니다. 그러나 첫 번째 숫자가 2이면 두 번째 숫자의 허용 값은 0, 1, 2 또는 3입니다.

단어 경계

unisei경계에서 끝나는 단어를 일치시키는 패턴을 작성하여 unicolor, watercolor, multicolor 등을 일치시키되 colorless 또는 colorful은 일치하지 않게 합니다. 이러한 예시를 직접 시도하여 익숙해지세요:

$ egrep 'color\>'

다음으로 unicolor, watercolor, multicolor 등을 일치시키지만 unicolor, watercolor, multicolor 등을 일치시키지 않는 colorless와 colorful을 일치시킵니다.

$ egrep '\<color'

따라서 정확한 단어 color를 일치시키려면:

$ egrep '\<color\>'

역참조

만약 우리가 ‘the the’나 ‘before before’와 같이 두 번 입력된 단어를 모두 일치시키고 싶다면 역참조를 사용해야 합니다. 역참조는 패턴을 기억하는 데 사용됩니다.

다음은 예시입니다:

$ egrep "\<the\> \1"

또는 일반적인 방법:

$ egrep "\<(.*)\> \1"

위의 예시는 성과 이름이 동일한 모든 이름을 찾을 때 사용할 수 있습니다. 괄호가 여러 개인 경우 두 번째, 세 번째, 네 번째 등은 \2, \3, \4 등으로 참조할 수 있습니다.

이것은 정규 표현식의 강력함에 대한 소개에 불과합니다.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-regular-expressions