스트림 편집기-정규식
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