Unix / Linux-SED를 사용한 정규식

이 장에서는 Unix에서 SED를 사용한 정규식에 대해 자세히 설명합니다.

정규식은 여러 문자 시퀀스를 설명하는 데 사용할 수있는 문자열입니다. 정규식은 다음을 포함하여 여러 다른 Unix 명령에서 사용됩니다.ed, sed, awk, grep, 그리고 더 제한적으로 vi.

여기 SED 약자 s떨다 editor. 이 스트림 지향 편집기는 스크립트 실행 전용으로 만들어졌습니다. 따라서 입력 한 모든 입력은 통과하여 STDOUT으로 이동하며 입력 파일을 변경하지 않습니다.

sed 호출

시작하기 전에 로컬 복사본이 있는지 확인하십시오. /etc/passwd 작업 할 텍스트 파일 sed.

앞서 언급했듯이 sed는 다음과 같이 파이프를 통해 데이터를 전송하여 호출 할 수 있습니다.

$ cat /etc/passwd | sed
Usage: sed [OPTION]... {script-other-script} [input-file]...

  -n, --quiet, --silent
                 suppress automatic printing of pattern space
  -e script, --expression = script
...............................

그만큼 cat 명령은 내용을 덤프합니다. /etc/passwd ...에 sed파이프를 통해 sed의 패턴 공간으로. 패턴 공간은 sed가 작업에 사용하는 내부 작업 버퍼입니다.

sed 일반 구문

다음은 sed의 일반적인 구문입니다-

/pattern/action

여기, pattern 정규식이고 action다음 표에 제공된 명령 중 하나입니다. 만약pattern 생략됩니다. action 위에서 본 것처럼 모든 라인에 대해 수행됩니다.

패턴을 둘러싸는 슬래시 문자 (/)는 구분 기호로 사용되기 때문에 필요합니다.

Sr. 아니. 범위 및 설명
1

p

라인을 인쇄합니다.

2

d

라인을 삭제합니다.

s/pattern1/pattern2/

pattern1의 첫 번째 발생을 pattern2로 대체합니다.

sed로 모든 라인 삭제

이제 sed로 모든 줄을 삭제하는 방법을 이해할 것입니다. sed를 다시 호출하십시오. 그러나 sed는 이제editing command delete line, 단일 문자로 표시 d

$ cat /etc/passwd | sed 'd'
$

파이프를 통해 파일을 전송하여 sed를 호출하는 대신 다음 예제와 같이 sed가 파일에서 데이터를 읽도록 지시 할 수 있습니다.

다음 명령은 cat 명령없이 이전 예제에서와 똑같습니다.

$ sed -e 'd' /etc/passwd
$

sed 주소

sed는 주소도 지원합니다. 주소는 파일의 특정 위치 또는 특정 편집 명령을 적용해야하는 범위입니다. sed가 주소를 발견하지 못하면 파일의 모든 행에서 작업을 수행합니다.

다음 명령은 사용했던 sed 명령에 기본 주소를 추가합니다.

$ cat /etc/passwd | sed '1d' |more
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$

숫자 1이 delete edit명령. 이것은 sed가 파일의 첫 번째 줄에서 편집 명령을 수행하도록 지시합니다. 이 예에서 sed는/etc/password 나머지 파일을 인쇄합니다.

sed 주소 범위

이제 우리는 the sed address ranges. 그렇다면 파일에서 한 줄 이상을 제거하려면 어떻게해야합니까? 다음과 같이 sed로 주소 범위를 지정할 수 있습니다.

$ cat /etc/passwd | sed '1, 5d' |more
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
$

위의 명령은 1부터 5까지의 모든 줄에 적용됩니다. 이렇게하면 처음 5 줄이 삭제됩니다.

다음 주소 범위를 시도하십시오-

Sr. 아니. 범위 및 설명
1

'4,10d'

4부터 라인 10까지 삭제

2

'10,4d'

sed가 역방향으로 작동하지 않기 때문에 10 번째 줄만 삭제됩니다.

'4,+5d'

파일의 4 행과 일치하고 해당 행을 삭제하고 다음 5 행을 계속 삭제 한 다음 삭제를 중단하고 나머지를 인쇄합니다.

4

'2,5!d'

2 시작을 제외하고이 삭제 된 모든 5까지 라인

5

'1~3d'

이렇게하면 첫 번째 줄이 삭제되고 다음 세 줄로 넘어간 다음 네 번째 줄이 삭제됩니다. Sed는 파일이 끝날 때까지이 패턴을 계속 적용합니다.

6

'2~2d'

이것은 sed에게 두 번째 줄을 삭제하고, 다음 줄로 넘어 가고, 다음 줄을 삭제하고, 파일 끝에 도달 할 때까지 반복하도록 지시합니다.

7

'4,10p'

4 라인부터 10까지 번째 인쇄

8

'4,d'

이것은 구문 오류를 생성합니다.

9

',10d'

이것은 또한 구문 오류를 생성합니다.

Note − 사용 중 p 액션을 사용하려면 -n라인 인쇄의 반복을 방지하는 옵션. 다음 두 명령의 차이점을 확인하십시오-

$ cat /etc/passwd | sed -n '1,3p'
Check the above command without -n as follows −
$ cat /etc/passwd | sed '1,3p'

대체 사령부

다음으로 표시되는 대체 명령 s는 지정한 문자열을 지정한 다른 문자열로 대체합니다.

한 문자열을 다른 문자열로 대체하려면 sed에 첫 번째 문자열이 끝나고 대체 문자열이 시작되는 위치에 대한 정보가 있어야합니다. 이를 위해 슬래시 ()로 두 문자열을 예약 처리합니다./) 캐릭터.

다음 명령은 문자열의 행에서 첫 번째 항목을 대체합니다. root 문자열로 amrood.

$ cat /etc/passwd | sed 's/root/amrood/'
amrood:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
..........................

sed는 한 줄의 첫 번째 항목 만 대체한다는 점에 유의해야합니다. 문자열 루트가 한 줄에 두 번 이상 발생하면 첫 번째 일치 항목 만 대체됩니다.

sed가 전역 대체를 수행하려면 문자를 추가하십시오. g 다음과 같이 명령의 끝까지-

$ cat /etc/passwd | sed 's/root/amrood/g'
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
...........................

대체 플래그

이외에도 전달할 수있는 기타 유용한 플래그가 많이 있습니다. g 플래그를 지정하고 한 번에 둘 이상을 지정할 수 있습니다.

Sr. 아니. 플래그 및 설명
1

g

첫 번째 일치뿐만 아니라 모든 일치를 바꿉니다.

2

NUMBER

NUMBER 번째 일치 만 바꿉니다.

p

대체가 이루어진 경우 패턴 공간을 인쇄합니다.

4

w FILENAME

대체 된 경우 결과를 FILENAME에 기록합니다.

5

I or i

대소 문자를 구분하지 않는 방식으로 일치

6

M or m

특수 정규식 문자 ^ 및 $의 정상적인 동작에 추가하여,이 플래그는 ^가 줄 바꿈 뒤의 빈 문자열과 일치하고 $는 줄 바꿈 앞의 빈 문자열과 일치하도록합니다.

대체 문자열 구분 기호 사용

슬래시 문자를 포함하는 문자열에서 대체를 수행해야한다고 가정하십시오. 이 경우 뒤에 지정된 문자를 제공하여 다른 구분 기호를 지정할 수 있습니다.s.

$ cat /etc/passwd | sed 's:/root:/amrood:g'
amrood:x:0:0:amrood user:/amrood:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh

위의 예에서 우리는 :delimiter 슬래시 대신 / 검색을 시도했기 때문에 /root 단순한 루트 대신.

빈 공간으로 바꾸기

빈 대체 문자열을 사용하여 루트 문자열을 /etc/passwd 완전히 파일-

$ cat /etc/passwd | sed 's/root//g'
:x:0:0::/:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh

주소 대체

문자열을 대체하려면 sh 문자열로 quiet 10 행에서만 다음과 같이 지정할 수 있습니다.

$ cat /etc/passwd | sed '10s/sh/quiet/g'
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/quiet

마찬가지로 주소 범위 대체를 수행하려면 다음과 같이 할 수 있습니다.

$ cat /etc/passwd | sed '1,5s/sh/quiet/g'
root:x:0:0:root user:/root:/bin/quiet
daemon:x:1:1:daemon:/usr/sbin:/bin/quiet
bin:x:2:2:bin:/bin:/bin/quiet
sys:x:3:3:sys:/dev:/bin/quiet
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

출력에서 볼 수 있듯이 처음 다섯 줄에는 문자열이 있습니다. sh 로 변경 quiet, 그러나 나머지 줄은 그대로 두었습니다.

매칭 명령

당신은 p 옵션과 함께 -n 다음과 같이 모든 일치하는 줄을 인쇄하는 옵션-

$ cat testing | sed -n '/root/p'
root:x:0:0:root user:/root:/bin/sh
[root@ip-72-167-112-17 amrood]# vi testing
root:x:0:0:root user:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

정규식 사용

패턴을 일치시키는 동안 더 많은 유연성을 제공하는 정규식을 사용할 수 있습니다.

daemon으로 시작하는 모든 행과 일치하는 다음 예제를 확인한 다음 삭제합니다.

$ cat testing | sed '/^daemon/d'
root:x:0:0:root user:/root:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh

다음은로 끝나는 모든 줄을 삭제하는 예입니다. sh

$ cat testing | sed '/sh$/d'
sync:x:4:65534:sync:/bin:/bin/sync

다음 표에는 정규식에서 매우 유용한 네 가지 특수 문자가 나열되어 있습니다.

Sr. 아니. 캐릭터 및 설명
1

^

줄의 시작과 일치

2

$

줄의 끝과 일치

.

단일 문자와 일치

4

*

0 개 이상의 이전 문자와 일치

5

[chars]

chars에 지정된 문자 중 하나와 일치합니다. 여기서 chars는 일련의 문자입니다. -문자를 사용하여 문자 범위를 나타낼 수 있습니다.

일치하는 문자

몇 가지 표현을 더 살펴보면 metacharacters. 예를 들어, 다음 패턴-

Sr. 아니. 표현 및 설명
1

/a.c/

다음과 같은 문자열을 포함하는 행과 일치합니다. a+c, a-c, abc, match, 및 a3c

2

/a*c/

다음과 같은 문자열과 함께 동일한 문자열을 찾습니다. ace, yacc, 및 arctic

/[tT]he/

문자열과 일치 Thethe

4

/^$/

빈 줄과 일치

5

/^.*$/

그것이 무엇이든 전체 라인과 일치

6

/ */

하나 이상의 공백과 일치

7

/^$/

성냥 blank 윤곽

다음 표는 자주 사용되는 문자 집합을 보여줍니다.

Sr. 아니. 세트 및 설명
1

[a-z]

단일 소문자와 일치

2

[A-Z]

단일 대문자와 일치

[a-zA-Z]

단일 문자와 일치

4

[0-9]

단일 숫자와 일치

5

[a-zA-Z0-9]

단일 문자 또는 숫자와 일치

문자 클래스 키워드

일부 특수 키워드는 일반적으로 regexps, 특히 regexps. 이것들은 일을 단순화하고 가독성을 향상시키기 때문에 sed 정규식에 매우 유용합니다.

예를 들어, 문자 a through z 그리고 캐릭터 A through Z, 키워드가있는 문자 클래스를 구성합니다. [[:alpha:]]

알파벳 문자 클래스 키워드를 사용하면이 명령은 /etc/syslog.conf 알파벳 문자로 시작하는 파일 −

$ cat /etc/syslog.conf | sed -n '/^[[:alpha:]]/p'
authpriv.*                         /var/log/secure
mail.*                             -/var/log/maillog
cron.*                             /var/log/cron
uucp,news.crit                     /var/log/spooler
local7.*                           /var/log/boot.log

다음 표는 GNU sed에서 사용 가능한 문자 클래스 키워드의 전체 목록입니다.

Sr. 아니. 캐릭터 클래스 및 설명
1

[[:alnum:]]

영숫자 [az AZ 0-9]

2

[[:alpha:]]

알파벳 [az AZ]

[[:blank:]]

공백 문자 (공백 또는 탭)

4

[[:cntrl:]]

제어 문자

5

[[:digit:]]

숫자 [0-9]

6

[[:graph:]]

보이는 모든 문자 (공백 제외)

7

[[:lower:]]

소문자 [az]

8

[[:print:]]

인쇄 가능한 문자 (비 제어 문자)

9

[[:punct:]]

구두점 문자

10

[[:space:]]

공백

11

[[:upper:]]

대문자 [AZ]

12

[[:xdigit:]]

16 진수 [0-9 af AF]

앰퍼샌드 참조

그만큼 sed metacharacter &일치 된 패턴의 내용을 나타냅니다. 예를 들어 다음과 같은 파일이 있다고 가정합니다.phone.txt 다음과 같은 전체 전화 번호-

5555551212
5555551213
5555551214
6665551215
6665551216
7775551217

당신은 만들고 싶어 area code(처음 세 자리) 쉽게 읽을 수 있도록 괄호로 묶습니다. 이를 위해 앰퍼샌드 대체 문자를 사용할 수 있습니다.

$ sed -e 's/^[[:digit:]][[:digit:]][[:digit:]]/(&)/g' phone.txt
(555)5551212
(555)5551213
(555)5551214
(666)5551215

(666)5551216
(777)5551217

여기 패턴 부분에서 처음 세 자리를 일치시키고 다음을 사용합니다. & 이 3 자리 숫자를 주변으로 대체합니다. parentheses.

여러 sed 명령 사용

다음과 같이 단일 sed 명령에서 여러 sed 명령을 사용할 수 있습니다.

$ sed -e 'command1' -e 'command2' ... -e 'commandN' files

여기 command1 ...을 통하여 commandN이전에 설명한 유형의 sed 명령입니다. 이 명령은 파일이 제공하는 파일 목록의 각 행에 적용됩니다.

동일한 메커니즘을 사용하여 위의 전화 번호 예를 다음과 같이 작성할 수 있습니다.

$ sed -e 's/^[[:digit:]]\{3\}/(&)/g'  \ 
   -e 's/)[[:digit:]]\{3\}/&-/g' phone.txt 
(555)555-1212 
(555)555-1213 
(555)555-1214 
(666)555-1215 
(666)555-1216 
(777)555-1217

Note − 위의 예에서 문자 클래스 키워드를 반복하는 대신 [[:digit:]] 세 번, 우리는 그것을 \{3\}, 이는 앞의 정규 표현식이 세 번 일치 함을 의미합니다. 우리는 또한 사용했습니다\ 줄 바꿈을 제공하려면 명령을 실행하기 전에 제거해야합니다.

역 참조

그만큼 ampersand metacharacter유용하지만 더 유용한 것은 정규 표현식에서 특정 영역을 정의하는 기능입니다. 이러한 특수 영역은 대체 문자열에서 참조로 사용할 수 있습니다. 정규식의 특정 부분을 정의하면 특수 참조 문자로 해당 부분을 다시 참조 할 수 있습니다.

할 것 back references, 먼저 지역을 정의한 다음 해당 지역을 다시 참조해야합니다. 영역을 정의하려면 다음을 삽입합니다.backslashed parentheses관심있는 각 지역 주변. 백 슬래시로 둘러싼 첫 번째 영역은 다음으로 참조됩니다.\1, 두 번째 지역 \2, 등등.

가정 phone.txt 다음 텍스트가 있습니다-

(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(666)555-1216
(777)555-1217

다음 명령을 시도하십시오-

$ cat phone.txt | sed 's/\(.*)\)\(.*-\)\(.*$\)/Area \ 
   code: \1 Second: \2 Third: \3/' 
Area code: (555) Second: 555- Third: 1212 
Area code: (555) Second: 555- Third: 1213 
Area code: (555) Second: 555- Third: 1214 
Area code: (666) Second: 555- Third: 1215 
Area code: (666) Second: 555- Third: 1216 
Area code: (777) Second: 555- Third: 1217

Note − 위의 예에서 괄호 안의 각 정규식은 다음에 의해 다시 참조됩니다. \1, \2등등. 우리는 사용했습니다\여기서 줄 바꿈을합니다. 명령을 실행하기 전에 제거해야합니다.