스트림 편집기-정규식

SED를 강력하고 효율적으로 만드는 것은 정규 표현식입니다. 정규식을 사용하여 여러 복잡한 작업을 해결할 수 있습니다. 모든 명령 줄 전문가는 정규식의 힘을 알고 있습니다.

다른 많은 GNU / Linux 유틸리티와 마찬가지로 SED도 정규 표현식을 지원합니다. regex. 이 장에서는 정규식에 대해 자세히 설명합니다. 이 장은 표준 정규식, 정규식의 POSIX 클래스 및 메타 문자의 세 섹션으로 나뉩니다.

표준 정규식

줄 시작 (^)

정규식 용어에서 캐럿 (^) 기호는 줄의 시작과 일치합니다. 다음 예제는 "The"패턴으로 시작하는 모든 행을 인쇄합니다.

[jerry]$ sed -n '/^The/ p' books.txt

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho

줄 끝 ($)

줄 끝은 달러 ($) 기호로 표시됩니다. 다음 예제는 "Coelho"로 끝나는 줄을 인쇄합니다.

[jerry]$ sed -n '/Coelho$/ p' books.txt

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

The Alchemist, Paulo Coelho 
The Pilgrimage, Paulo Coelho

단일 문자 (.)

Dot (.)은 줄 끝 문자를 제외한 모든 단일 문자와 일치합니다. 다음 예제는 문자 "t"로 끝나는 세 글자 단어를 모두 인쇄합니다.

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

cat 
bat 
rat 
mat

문자 집합 일치 ([])

정규식 용어에서 문자 집합은 대괄호 ([])로 표시됩니다. 여러 문자 중 하나만 일치시키는 데 사용됩니다. 다음 예제는 "Call"및 "Tall"패턴과 일치하지만 "Ball"은 일치하지 않습니다.

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

Call 
Tall

독점 세트 ([^])

배타적 집합에서 캐럿은 대괄호 안의 문자 집합을 부정합니다. 다음 예제는 "Ball"만 인쇄합니다.

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

Ball

문자 범위 ([-])

문자 범위가 제공되면 정규식은 대괄호로 지정된 범위 내의 모든 문자와 일치합니다. 다음 예는 "Call"및 "Tall"과 일치하지만 "Ball"은 일치하지 않습니다.

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

Call 
Tall

이제 범위를 "AP"로 수정하고 결과를 관찰하겠습니다.

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

Call 
Ball

한 번에 0 (\?)

SED에서 물음표 (\?)는 0 개 또는 1 개의 선행 문자와 일치합니다. 다음 예제는 "Behaviour"뿐만 아니라 "Behaviour"와도 일치합니다. 여기서는 "\?"를 사용하여 "u"를 옵션 문자로 만들었습니다.

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

Behaviour 
Behavior

하나 이상의 발생 (\ +)

SED에서 더하기 기호 (\ +)는 하나 이상의 선행 문자와 일치합니다. 다음 예제는 "2"가 하나 이상 일치합니다.

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

22 
123 
234 
222

0 개 이상 발생 (*)

별표 (*)는 0 개 이상의 선행 문자와 일치합니다. 다음 예제는 "ca", "cat", "catt"등과 일치합니다.

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

ca 
cat

정확히 N 개 발생 {n}

{n}은 이전 문자의 "n"항목과 정확히 일치합니다. 다음 예제는 세 자리 숫자 만 인쇄합니다. 하지만 그 전에 숫자 만 포함 된 다음 파일을 만들어야합니다.

[jerry]$ cat numbers.txt

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

1 
10 
100 
1000 
10000 
100000 
1000000 
10000000 
100000000 
1000000000

SED 표현식을 작성해 보겠습니다.

[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

100

중괄호 쌍은 "\"문자로 이스케이프됩니다.

n 회 이상 {n,}

{n,}은 선행 문자의 "n"개 이상의 발생과 일치합니다. 다음 예제는 5 자리 이상의 모든 숫자를 인쇄합니다.

[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

10000 
100000 
1000000
10000000 
100000000 
1000000000

M ~ N 발생 {m, n}

{m, n}은 이전 문자의 최소 "m"및 최대 "n"발생과 일치합니다. 다음 예제는 5 자리 이상 8 자리 이하의 모든 숫자를 인쇄합니다.

[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

10000 
100000 
1000000 
10000000

파이프 (|)

SED에서 파이프 문자는 논리적 OR 연산처럼 작동합니다. 파이프 양쪽의 항목과 일치합니다. 다음 예제는 "str1"또는 "str3"과 일치합니다.

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

str1 
str3

괄호와 파이프 (|)의 쌍은 "\"문자로 이스케이프됩니다.

이스케이프 문자

특정 특수 문자가 있습니다. 예를 들어, 개행은 "\ n"으로 표시되고 캐리지 리턴은 "\ r"로 표시됩니다. 이러한 문자를 일반 ASCII 컨텍스트로 사용하려면 백 슬래시 (\) 문자를 사용하여 이스케이프해야합니다. 이 장에서는 특수 문자의 이스케이프를 설명합니다.

"\"이스케이프

다음 예제는 "\"패턴과 일치합니다.

[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

str1\str2

"\ n"이스케이프

다음 예제는 새 줄 문자와 일치합니다.

[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

str1\nstr2

"\ r"이스케이프

다음 예제는 캐리지 리턴과 일치합니다.

[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

str1\rstr2

"\ dnnn"이스케이프

이것은 10 진수 ASCII 값이 "nnn"인 문자와 일치합니다. 다음 예제는 문자 "a"와만 일치합니다.

[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

a

"\ onnn"이스케이프

이것은 8 진수 ASCII 값이 "nnn"인 문자와 일치합니다. 다음 예제는 문자 "b"와만 일치합니다.

[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

b

16 진수 ASCII 값이 "nnn"인 문자와 일치합니다. 다음 예는 문자 "c"와만 일치합니다.

[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

c

정규식의 POSIX 클래스

특별한 의미를 가진 특정 예약어가 있습니다. 이러한 예약어를 정규식의 POSIX 클래스라고합니다. 이 섹션에서는 SED에서 지원하는 POSIX 클래스에 대해 설명합니다.

[: alnum :]

알파벳과 숫자를 의미합니다. 다음 예제는 "One"및 "123"만 일치하지만 탭 문자와는 일치하지 않습니다.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

One 
123

[: 알파 :]

알파벳 문자 만 의미합니다. 다음 예는 "One"이라는 단어와 만 일치합니다.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

One

[:공백:]

공백 또는 탭이 될 수있는 공백 문자를 의미합니다. 다음 예제는 탭 문자와 만 일치합니다.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

^I$

"cat -vte"명령은 탭 문자 (^ I)를 표시하는 데 사용됩니다.

[:숫자:]

십진수 만 의미합니다. 다음 예는 숫자 "123"과만 일치합니다.

[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

123

[:보다 낮은:]

소문자 만 의미합니다. 다음 예제는 "one"만 일치합니다.

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

one

[:높은:]

대문자 만 의미합니다. 다음 예는 "TWO"와만 일치합니다.

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

TWO

[: punct :]

공백 또는 영숫자가 아닌 문자를 포함하는 구두점을 의미합니다.

[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

One,Two

[:우주:]

공백 문자를 의미합니다. 다음 예는이를 설명합니다.

[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

123^L^I$

메타 문자

기존 정규식과 마찬가지로 SED는 메타 문자도 지원합니다. 이것은 Perl 스타일 정규식입니다. 메타 문자 지원은 GNU SED에 따라 다르며 다른 SED 변형에서는 작동하지 않을 수 있습니다. 메타 문자에 대해 자세히 논의하겠습니다.

단어 경계 (\ b)

정규식 용어에서 "\ b"는 단어 경계와 일치합니다. 예를 들어, "\ bthe \ b"는 "the"와 일치하지만 "these", "there", "they", "then"등과는 일치하지 않습니다. 다음 예는이를 설명합니다.

[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

the

비 단어 경계 (\ B)

정규식 용어에서 "\ B"는 비 단어 경계와 일치합니다. 예를 들어, "the \ B"는 "these"및 "they"와 일치하지만 "the"는 일치하지 않습니다. 다음 예는이를 설명합니다.

[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

these 
they

단일 공백 ​​(\ s)

SED에서 "\ s"는 단일 공백 ​​문자를 의미합니다. 다음 예제는 "Line \ t1"과 일치하지만 "Line1"과는 일치하지 않습니다.

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

Line 1

단일 비 공백 (\ S)

SED에서 "\ S"는 단일 공백 ​​문자를 의미합니다. 다음 예제는 "Line2"와 일치하지만 "Line \ t1"과는 일치하지 않습니다.

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

Line2

단일 단어 문자 (\ w)

SED에서 "\ w"는 단일 단어 문자, 즉 알파벳 문자, 숫자 및 밑줄 (_)을 의미합니다. 다음 예는이를 설명합니다.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

One 
123 
1_2

단일 단어가 아닌 문자 (\ W)

SED에서 "\ W"는 "\ w"와 정확히 반대되는 단어가 아닌 단일 문자를 의미합니다. 다음 예는이를 설명합니다.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

&;#

패턴 공간의 시작 (\`)

SED에서 "\`"는 패턴 공간의 시작을 의미합니다. 다음 예는 "One"이라는 단어와 만 일치합니다.

[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'

위의 코드를 실행하면 다음과 같은 결과가 나타납니다.

One