흔히 regex로 줄여 부르는 정규 표현식은 텍스트 패턴을 설명합니다. grep, sed, awk 같은 도구가 정규 표현식을 사용하지만 지원하는 구문은 다를 수 있으므로 항상 도구와 정규 표현식 종류를 확인해야 합니다.
고급 Text-Fu · 레슨 1
regex (정규 표현식)
앵커, 문자 집합, 반복, 정규 표현식 종류가 텍스트 패턴 일치를 제어하는 방식을 배웁니다.
GNU grep은 기본적으로 기본 정규 표현식(BRE)을 사용하고 -E를 지정하면 확장 정규 표현식(ERE)을 사용합니다. 이 레슨에서는 둘이 공유하는 구성 요소를 소개한 뒤 흔한 ERE 추가 요소를 설명합니다.
예제에는 다음 입력을 사용합니다.
sally sells seashells
by the seashore
문자 그대로의 텍스트 일치시키기
대부분의 일반 문자는 자기 자신과 일치합니다. 패턴 seashells는 그 정확한 문자열이 어디든 들어 있는 줄을 선택합니다.
$ grep 'seashells' sample.txt
sally sells seashells
일치 도구가 받기 전에 쉘이 패턴을 확장하거나 분리하지 않도록 정규 표현식 패턴을 따옴표로 묶으세요. 정규 표현식은 쉘 경로명 확장과도 다릅니다. 정규 표현식에서 *는 앞의 원자를 반복하지만 쉘 글로브에서 *는 경로명 문자 문자열에 대응하는 와일드카드 자체입니다.
ab* 같은 정규 표현식에서 *는 무엇을 하나요?
일치 위치 고정하기
대괄호 표현식 밖에서 패턴 시작의 ^는 줄 시작에 일치 위치를 고정합니다.
^by
$ 앵커는 줄 끝에 일치합니다.
seashore$
전체 줄이 패턴에 맞아야 하면 두 앵커를 함께 사용합니다.
^by the seashore$
전체 텍스트가 by the seashore인 줄에만 일치하는 패턴은 무엇인가요?
문자 하나 일치시키기
일반적인 줄 단위 정규 표현식 모드에서 점은 문자 하나와 일치합니다.
b.
by와 일치하지만 ba나 b7에도 일치할 수 있습니다. 뒤에 문자 하나가 필요하므로 b 하나만 있는 경우에는 일치하지 않습니다. 문자 그대로의 마침표에는 \.로 이스케이프하거나 알맞은 대괄호 표현식 안에 넣습니다.
전체 줄 패턴 ^b.$와 일치하지 않는 문자열은 무엇인가요?
대괄호 표현식 사용하기
대괄호 표현식은 지정한 집합의 문자 하나와 일치합니다.
s[ae]lls
이 위치에서 sells 또는 salls와 일치합니다.
^가 [ 바로 뒤의 첫 문자이면 집합을 부정합니다.
s[^e]lls
첫 번째 s 다음 문자가 e일 수 없으므로 salls와 일치하지만 sells와는 일치하지 않습니다.
[^e]는 무엇과 일치하나요?
범위는 두 끝점 사이의 문자를 설명할 수 있습니다.
d[a-c]g
dag, dbg, dcg와 일치할 수 있습니다. 범위 동작은 로캘 배열에 따라 달라질 수 있습니다. [[:lower:]], [[:upper:]], [[:digit:]] 같은 문자 클래스가 의도를 더 명확하게 표현하는 경우가 많습니다.
패턴 반복하고 결합하기
BRE와 ERE 모두에서 *는 앞 원자의 0번 이상 반복을 뜻합니다.
seashells*
seashell 뒤에 s가 0개 이상 이어지는 문자열과 일치합니다. grep -E를 사용하는 ERE 모드의 흔한 연산자는 다음과 같습니다.
+: 1번 이상 반복?: 0번 또는 1번 반복|: 왼쪽 표현식 또는 오른쪽 표현식(...): 표현식 그룹화
예를 들면 다음과 같습니다.
$ grep -E '^(cat|dog)s?$' animals.txt
전체 줄이 cat, cats, dog, dogs 중 하나인 경우를 선택합니다. BRE 모드에서는 이 연산자의 이스케이프 규칙이 다르므로 확인 없이 패턴을 종류 사이에 복사하지 마세요.
패턴 ^(cat|dog)s?$에 확장 정규 표현식 구문을 활성화하는 명령어는 무엇인가요?
Linux 텍스트 도구로 정규 표현식 선택을 연습하려면 다음 실습을 진행해 보세요.
- Linux에서 grep으로 텍스트 검색 - 기본 검색, 줄 번호,
^와$앵커, 기본 및 확장 정규 표현식을 연습합니다. - 텍스트 처리와 정규 표현식 -
grep,sed,awk와 정규 표현식으로 텍스트를 효율적으로 조작하고 패턴을 일치시킵니다. - 메일과 숫자 추출하기 -
grep과 정규 표현식으로 파일에서 이메일 주소와 숫자를 추출합니다.
레슨 완료
regex (정규 표현식) 완료
이제 줄 단위 정규 표현식의 기초를 읽고 만들 수 있습니다.
정규 표현식 연산자와 쉘 경로명 와일드카드를 구분할 수 있습니다.
줄 시작이나 끝에 일치 위치를 고정할 수 있습니다.
점이나 대괄호 표현식으로 문자 하나를 일치시킬 수 있습니다.
집합을 부정하고 로캘을 고려하는 문자 클래스를 사용할 수 있습니다.
BRE 또는 ERE 구문을 의도적으로 선택할 수 있습니다.