쉘스크립트

진화된 sed

트리스탄1234 2022. 7. 6. 13:20
728x90
반응형

 

1. Multiline Commands

기본적으로 sed editer는 여러개의 data라인에서 한번에 한개의 라인을 처리하고 다음 라인을 처리 하는 구조로 동작을 합니다. 하지만 처리할 데이터가 여러개의 라인에 걸쳐 있을때 기본 sed 처리 구조로는 데이터 처리가 힘들어 지게 됩니다. 이를 위해 advanced sed 에디터는 아래 3개의 명령어를 제공 합니다.

■ N: 기존의 데이터 스트림에 신규 데이터 라인을 추가 하게 해 줍니다.

■ D: 여려개의 그룹에서 한개의 라인을 삭제하게 합니다.

■ P: 여러개의 데이터 그룹에서 한개의 match되는 라인을 출력

next 명령어

소문자 n 명령어는 sed 에디터에게 데어터 스트림에서 다음라인으로 넘어 가라고 지시를 합니다.

next 명령의 이해를 돕기 위해 아래의 예를 살펴 보도록 하겠 습니다.

$ cat test1 ==> test1 파일의 내용을 보면 3개의 문자열이 빈 문자열로 구분이 되어 있음
This is the header line.
 
This is a data line.
This is the last line.
$ sed ’/header/{
> n ==> sed 에디터에게 다음라인으로 이동 지시
> d ==> 컷번째 공백 라인에서 해당 라인 삭제 지시
> }’ data1
This is the header line. ==> 결과를 보면 첫번째 라인과 두번째 라인 사이의 공백이 사라진 것이 보임
This is a data line.
This is the last line.
$
하지만 만약에 모든 공백 라인을 삭제를 하고 싶으면 아래 처럼 사용을 하면 됩니다.
$ sed ’/^$/d’ data1 ==> 시작과 끝사이에 있는 모든 공백 라인을 삭제를 합니다.
This is the header line.
This is a data line.
This is the last line.

여러개의 문장을 합치기

n과 N의 차리를 잠깐 설명해 보도록 하겠습니다. n명령은 pattern에 match가 되는 문자열을 만났을때 다음라인으로 이동하는 반면에, N은 pattern에 match되는 문자열을 만나면 다음 라인을 pattern에 match되는 문자열 다음으로 삽입을 하게 됩니다. 즉 쉽개 말하면 2개의 문자열을 합치게 되는 효과가 있습니다. 아래 예를 살펴 보도록 하겠습니다.

$ cat data2 -==> data 2파일의 내용을 살펴 보도록 하겠습니다.
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$ sed ’/first/{ ==> first가 있는 문자열을 만나면
> N ==> 다음라인의 문장으로 이동 후 pattern 뒤에 삽입
> s/\n/ / > }’ data2 ==> newline 문자를 공백으로 변경 후 2개의 문장 병합.
This is the header line.
This is the first data line. This is the second data line.
This is the last line.
$
아래의 예제를 살펴 보도록 합시다. 1개의 라인에서 패턴에 매치되는 데이터 처리는 쉽지만 아래의 2개의 라이에 거처서 매치되는 패턴을 처리를 하지 못합니다.
$ cat data3
The first meeting of the Linux System
Administrator’s group will be held on Tuesday.
All System Administrators should attend this meeting.
Thank you for your attendance.
$ sed ’s/System Administrator/Desktop User/’ data3 ==> System Administrator를 Desktop으로 변경
The first meeting of the Linux System ==> 1번째 라인과 두번째 라인에 걸쳐 있는 pattern은 처리 못함.
Administrator’s group will be held on Tuesday.
All Desktop Users should attend this meeting. ==> pattern에 매치되는 문자열이 교체 되었음
Thank you for your attendance.
$
그럼 N명령어를 사용해 2개의 라인에 걸쳐 있는 패턴을 처리해 보도록 하겠습니다.
$ sed ’
> N
> s/System\nAdministrator/Desktop\nUser/ ==> 2개의 라인에서 데이터가 매치 되는 경우
> s/System Administrator/Desktop User/ ==> 1개의 라인에서 데이터가 매치 되는 경우
> ’ data3
The first meeting of the Linux Desktop
User’s group will be held on Tuesday.
All Desktop Users should attend this meeting.
Thank you for your attendance. $

반응형

N명령은 pattern 공간에서 항상 다음라인의 데이터를 읽어 들입니다. 하지만 만약 매치 되는 데이터가 마지막 라인에 있는 경우에는 다음라인이 없기 때문에 요구된 처리를 하지 못하고 sed 에디터가 종료 되게 됩니다.

아래 예제를 살펴 봅시다.

$ cat data4
The first meeting of the Linux System
Administrator’s group will be held on Tuesday.
All System Administrators should attend this meeting.
$ sed ’
> N
> s/System\nAdministrator/Desktop\nUser/
> s/System Administrator/Desktop User/
> ’ data4
The first meeting of the Linux Desktop
User’s group will be held on Tuesday.
All System Administrators should attend this meeting. ==> 마지막 라인은 변경이 되지 않았습니다.
$
이를 해결 하기 위해서 N명령어 앞에 한개의 라인에서 처리 명령을 N명령 앞에 넣어 주면 됩니다.
$ sed ’
> s/System Administrator/Desktop User/
> N
> s/System\nAdministrator/Desktop\nUser/
> ’ data4
The first meeting of the Linux Desktop ==> N명령어 뒤의 교체 명령으로 변경 됨.
User’s group will be held on Tuesday.
All Desktop Users should attend this meeting. ==> N명령어 이전의 교체 명령으로 변경됨.
$

여러라인에서 삭제 하기

Pattern에 매치 되는 데이터가 2개의 라인에 걸쳐 있는경우 N 명령어 사용에 주의 하여야 합니다.

아래의 예제를 살펴 봅시다.

$ cat data4
The first meeting of the Linux System ==> 2개의 라인에 결쳐 있는 데이터만 삭제를 원하는 경우
Administrator’s group will be held on Tuesday.
All System Administrators should attend this meeting.
$ sed ’
> N
> /System\nAdministrator/d
> ’ data3
All System Administrators should attend this meeting. ==> 위의 data4에서 1번째와 2번째 라인 삭제
$
예상과 다르게 2개의 라인이 모두 삭제가 되었습니다. 이럴때 D옵션을 사용을 하게되면 패턴에 매치 되는 2개의 라인중 첫번째 라인만 삭제를 합니다. 아래 예를 살펴 봅시다.
$ sed ’
> N
> /System\nAdministrator/D
> ’ data3
Administrator’s group will be held on Tuesday.
All System Administrators should attend this meeting.
$
하나의 예를 더 살펴 보도록 하겠습니다. 아래 예제는 첫번째 공백라인을 삭제 하는 예제 입니다.
$ cat data5
==> 공백 라인 삭제를 해 보겠 습니다.
This is the header line.
This is a data line.
This is the last line.
$ sed ’/^$/{ ==> 시작과 끝라인 사이에 공백라인을 정의
> N ==> 공백 라인과 다음라인을 한개의 라인으로
> /header/D ==> 그 중 header가 있는 라인의 공백 제거
> }’ data5
This is the header line.
This is a data line.
This is the last line.
$

여러개의 라인 출력 하는 명령어

P명령은 매치 되는 패턴이 2개의 라인에 걸쳐 있는 경우 첫번째 라인을 출력을 해 줍니다.

아래 예를 한번 살펴 봅시다.

$ sed -n ’
> N
> /System\nAdministrator/P
> ’ data3
The first meeting of the Linux System
$

2. Hold Space

sed 에디터는 pattern space라는 버퍼에 검사할 문장을 처리 하기 위해 저장을 합니다. 그리고 hold space는 pattern space에서 다른라인을 작업 하는 동안 임시적으로 라인을 저장하게 할수 있습니다.

Hold Space와 관련된 명령어에는 아래의 다섯가지 명령이 있습니다. 이 명령어들은 Pattern Space에 있는 텍스트를 Hol d Space에 임시 저장하게 해 줍니다.

위의 명령어 사용 예제를 살펴 봅시다.

$ cat data2
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$ sed -n ’/first/{
> h ==> first 문자를 만나면 해당 라인을 Hold로 저장
> p ==> pattern space에 있는 라인을 출력
> n ==> 다음 라인을 Pattern Space에 저장
> p ==> 저장된 라인을 출력
> g ==> Hold Space에 있는 라인을 Pattern Space로 이동
> p ==> 이동된 라인을 출력
> }’ data2
This is the first data line.
This is the second data line.
This is the first data line.
$
first와 second의 문장 순서를 바꾸어 출력을 해보도록 하겠습니다.
$ sed -n ’/first/{
> h
> n
> p
> g
> p
> }’ data2
This is the second data line.
This is the first data line.
$

3. Negating Command(명령어 부정)

앞에서 살펴본 명령어들은 모든 데이터 라인에 적용을 하거나 특정 라인에 해당 명령을 적용을 하는것을 살펴 보았 습니다. 여기서는 반대로 특정 라인에 명령어가 적용되지 않게 하는 방법을 살펴 보도록 하겠습니다.

명령어를 부정하기 위한 기호로 느낌표'!'로 해당 명령을 적용되지 않게 할수 있습니다.

아래 예제를 살펴 보도록 하겠 습니다.

$ sed -n ’/header/!p’ data2 ==> header가 들어 있지 않은 라인을 출력 합니다.
This is the first data line.
This is the second data line.
This is the last line.

텍스트 스트림에서 마지막 라인을 첫번째로, 첫번째 라인을 마지막으로 뒤집는 방법에 대해서 살펴 보도록 하겠 습니다. 우선 순서를 간단히 요약을 해보면 아래오 같은 작업이 필요 합니다.

A. 라인을 Hold Space로 저장

B. 다음라인을 Pattern Space로 저장

C. Hold Space를 Pattern Space로 추가

D. Pattern Space를 Hold Space로 저장

E. 2번에서 4번을 라인의 마지막까지 반복하기

F. 라인조회 하기.

텍스트 순서 뒤집기

아래의 예제를 살펴 보도록 합시다.

$cat data2
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$ sed -n ’{ ==> -n 옵션은 라인별 처리 되는 결과를 프린터에 표시되지 않게 해 줍니다.
1!G ==> G옵션은 hold space를 pattern space로 추가 해 줍니다.
h ==> pattern space를 hold space로 옮겨 줍니다.
$p }’ data2 ==> data 2파일의 처리 결과를 출력해 줍니다.
This is the last line.
This is the second data line.
This is the first data line.
This is the header line.
$

tac명령은 cat과 비스하게 파일의 내용을 출력을 해주시만 출력을 마지막 라인부터 처음라인으로 출력을 하게 해 주는 명령입니다.

4. Changing The Flow(스크립트 수행 순서 바꾸기)

일반적으로 sed 편집기는 스크립트의 맨 윗쪽 라인부터 처리해서 마지막 라인으로 처리가 되는 순서로 진행 됩니다. 물론 D명령은 sed를 새로운 데이터 라인을 읽어 들이지 않고 시작 라인으로 돌아가게 하지만, sed 에디어는 이런 스크립트의 수행 순서를 바꾸어 주는 기능을 제공 합니디.

Brabching

앞의 예제에서 보았듯이 느낌표('!)는 해당 라인에 명령어가 수행되지 않게 하는걸 보았습니다. 이와 유사하게 branch명령은 주소라 주소 범위를 지정하여 해당 범위의 데이터 라인은 스크립트 명령이 수행 되지 않도록 할 수 있습니다.

branch 명령어 사용 구문

[address]b [label]

label 파라메터는 branch 명령어에게 위치를 정의해 주는 역활을 합니다. 만약 label이 정의가 되지 않으면 branch명령은 스크립트의 마지막까지를 처리 하게 됩니다. 아래 예제를 살펴 봅시다.

$ cat data2 ==> data2의 파일 내용 입니다.
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$ sed ’{
> 2,3b ==> 2번째 라인과 3번째 라인에는 아래의 스크립트가 미적용
> s/This is/Is this/
> s/line./test?/ >
} ’ data2
Is this the header test? ==>결과를 보면 2번째와 3번째를 제외한 모든 라인이 변경.
This is the first data line.
This is the second data line.
Is this the last test?
$
이번에는 레이블을 사용한 예제를 살펴 보겠습니다.
$ sed ’{
> /first/b jump1 ==> 데이터 라인에 first라는 단어가 있으면 jump1으로 이동
> s/ is/ might be/ ==> is를 might be로 변경
> s/line/test/ ==> line을 test로 변경
> :jump1 ==> first라인 단어를 가지는 라인은 여기서 부터 스크립트 실행
> s/data/text/ > ==> data를 text로 변경
}’ data2
This might be the header test. ==> 첫번째 header라인은 스크립트가 모두 적용됨
This is the first text line. ==> first가 있는 두번째 라인은 data만 text로 변경됨.
This might be the second text test.
This might be the last test.
$
아래의 예제는 Label를 활용해 루프로 만들어 컴마(,)를 하나씩 삭제해 가는 예제 입니다.
$ echo "This, is, a, test, to, remove, commas." | sed -n ’{
> :start ==> 스크립트의 첫번째에 Label을 두어 루프 효과를 발생
> s/,//1p ==> 컴마(,)를 공백으로 대체 후 출력
> b start ==> start로 이동
> }’
아래는 명령어 수행의 결과 입니다. 컴마가 라인가 없을때 까지 반복이 되는것을 보실 수 있습니다.
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.
하지만 위의 스크립트는 address를 지정해 주지 않아 무한 반복이 일어 납니다. 이를 해결 하기 위해서는 스크립트에 address를 지정을 해 주면 라인에 컴마가 없을때 스크립트가 자동 종료 되게 합니다.
아래 예제를 살펴 봅시다.
$ echo "This, is, a, test, to, remove, commas." | sed -n ’{
:start
s/,//1p
/,/b start ==> branch명령앞에 address로 컴마(,)를 지정하여 컴마가 있는 경우에만 start로 이동
}’
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.
$

Test 명령어

branch 명령어와 비슷하게 test명령어(t)도 스크립트의 실행 순서를 변경하기 위해 사용을 할수 있습니다.

barnch명령은 주소 기반으로 스크립트 순서가 변경이 되지만 test명령은 label기반으로 스크립트 순서가 변경이 됩니다.

Test명령은 s(문자 데체 명령어)명령어가 패턴에 매치되는 문자가 교체 되고 나면 특정 레이블로 이동을 하고 하지만 만약 데체 명령어가 패턴에 매치가 되지 않으면 test명령은 특정 label로 점프를 하지 않게 동작을 합니다.

명령어 사용구문은 아래와 같습니다.

[Address]t [label]

$ cat data2 ==> data2의 파일 내용 입니다.
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
아래의 예제는 두개의 s명령어에서 한개가 매치가 될때 나머지 s명령어의 처리 방식을 보여 줍니다.
$ sed ’{
> s/first/starting/ ==> first 문자를 starting으로 대체
> t
> s/line/test/ ==> line 문자를 test로 변경
> }’ data2
This is the header test. ==> line에 매치가 되어 test로 변경
This is the starting data line. ==> first가 매치되어 starting으로 변경 후 다음라인으로 이동
This is the second data test. ==> line을 test로 변경
This is the last test. ==> line을 test로 변경
$
그럼 branch명령어서 본 컴마(')삭제 하는 예제를 test명령을 이용해 살펴 보겠 습니다.
$ echo "This, is, a, test, to, remove, commas." | sed -n ’{
:start
s/,//1p
t start
}’
아래는 테스트 결과 입니다.
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.
$

4. Pattern replacemnet(패턴 교체)

Andpersand(&)

'&' 기호와 와일드 카드기호를 pattern에 사용하게 되면 매우 편리 합니다.

예를 들어 아래의 예제를 살펴 봅시다. 아래 예제에서는 와일드 마스크(.)를 사용하여 at앞에 어떤 문자가 오던지 ".at"으로 변경하고 싶은 경우 입니다 다시 말해서 cat은 "cat"으로 hat은 "hat"으로 만들고 싶을때 입니다.

$ echo "The cat sleeps in his hat." | sed ’s/.at/".at"/g’
The ".at" sleeps in his ".at". ==> 원하는 결과와 다르게 나옵니다.
$
그럼 '&'를 이용하여 처리를 해 보겠 습니다.
$ echo "The cat sleeps in his hat." | sed ’s/.at/"&"/g’ ==> &를 사용하여 문자 대체
The "cat" sleeps in his "hat". ==> 원하는 결과를 얻을수 있음을 볼수 있습니다.
$

문단에서 부분만 교체 하기

'&' 기호는 기본적으로 문단 전체를 패턴과 매치 되는지 검색을 합니다. 하지만 가끔은 문단 전체에서 특정 문장의 문자만 바꾸고 싶은 경우가 있습니다. 이럴 경우 소괄호'()"와 숫자를 이용해서 원하는 결과를 만들 수가 있습니다. 문장 전체에서 바꿀 문장을 소괄호'()를 이용하여 match를 시키고 패턴의 변경될 문자와 변경할 문자를 정의를 해 주면 됩니다.

$ echo "The System Administrator manual" | sed ’
> s/\(System\) Administrator/\1 User/’
==> 괄호'()' 기호로 전체 문장에서 부분 문장을 추출하고 매치 후 첫번째 등장하는 '\1' 문자를 User로 교체 , 여기서 \1은 문단 전체에서 패턴에 매치되는 첫번째 문장을 의미 합니다.
처리 결과 입니다.
The System User manual
$
$ echo "That furry cat is pretty" | sed ’s/furry \(.at\)/\1/’
That cat is pretty
$ echo "That furry hat is pretty" | sed ’s/furry \(.at\)/\1/’
That hat is pretty
$

문장 사이에 특정 문자 삽입하기

위의 예를 활용해서 매치되는 패턴 사이에 특정 문자를 삽입을 할수도 있습니다. 아래 예제를 살펴 봅시다.

$ echo "1234567" | sed ’{
> :start
> s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/
> t start
> }’
1,234,567
$
위의 예제를 보면 두가지 패턴
.*(0-9) 숫자로 끝나는 숫자 문자
[0-9]{3} ==> 0에서 9시이의 문자중 3자리 문자
\1,\2

5. 스트립트 안에서 sed 사용하기

wrapper 사용하기

스크립트가 굉장히 길고 스크립트를 전체 재 타이핑 해야할 경우에 sed 에디터를 shell wrapper에 위치시켜 간단하게 사용을 할수 있습니다. 여기서 wrapper은 command line과 sed 에디터 사이에서 동작을 하게 됩니다.

아래의 예제에서 사용법을 살펴 보도록 합시다.

$ cat data2 ==> data2의 파일 내용 입니다.
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$ cat reverse
#!/bin/bash
# shell wrapper for sed editor script to reverse lines
sed -n ’{
1!G
h
$p }’ "$1" ==> sed 에디터에서 Shell 변수는 $1을 사용하여 입력을 받을 수 있습니다.
$
$ ./reverse data2 ==> 이제 작성한 스크립트를 어떤 파일에서도 사용할수 있습니다.
This is the last line.
This is the second data line.
This is the first data line.
This is the header line.
$

sed 에디터의 출력을 리다이렉트 하기

Shell 명령어 처럼 sed 에디터도 기본 출력은 STDOUT 입니다. sed 에디터도 표준 출력을 파일이나 변수등으로 리다이렉트를 할수 있습니다.

아래 예를 통해서 살펴 보도록 합니다.

$ cat fact ==> 아래 예제를 20까지의 순열을 구하는 스크립트 입니다.
#!/bin/bash
#add commas to numbers in factorial answer
factorial=1
counter=1
number=$1
while [ $counter -le $number ]
do
factorial=$[ $factorial * $counter ]
counter=$[ $counter + 1 ]
done
result=`echo $factorial | sed ’{
:start
s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/ ==> test 명령어 설명 부분 참조 하세요.
t start
}’`
echo "The result is $result"
$ ./fact 20
The result is 2,432,902,008,176,640,000
$

6. sed 유틸리티 만들기

이번에는 sed를 이융한 유용한 유틸리트를 만들어 스크립트에 사용하는 예제를 살펴 보도록 하겠 습니다.

문장 사이 공백 넣기

아래의 예를 살펴 봅시다.

$ sed ’G’ data2 ==> G는 hold space에 있는 내용을 삽입을 해 줍니다 (현재 공백)
This is the header line.
This is the first data line.
==> 초기의 hold space에는 아무것도 없기 때문에 공백이 삽입
This is the second data line.
This is the last line.
==> 마지막 라인뒤에도 공백이 삽입됨.
$
만약 마지막 라인 뒤에 공백을 넣고 싶지 않는 경우에는 아래와 같이 이용을 하면 됩니다.
$ sed ’$!G’ data2
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$
만약 텍스트 파일에 공백이 두개 이상이나 공백이 없는 경우에 모든 라인에 동일하게 문장 별 공백 하나만 추가 하고 싶은 경우에는 아래와 같은 예제를 참고 하시면 됩니다.
$ sed ’/^$/d;$!G’ data6 ==> 시작과 끝(^$) 라인의 공백 삭제 후 마지막 라인을 제외하고 공백추가
This is line one.
This is line two.
This is line three.
This is line four.
$

파일에 라인 번호 표시하기

'=' 기호는 각 라인의 라인 번호를 표시해 줍니다. 다만 아래 그림처럼 해당라인의 위에 표시가 되기 때문에 보기에 불편 합니다. 이럴 경우에 같은 라인에 라인번호를 표시 하기 위해서는 두 라인을 결합하는 N옵션과 뉴라인 케릭터를 삭제하는 교체 명령을 사용하면 원하는대로 표시를 할 수가 있습니다. 아래의 예제를 살펴 봅시다.

단순의 '='기호를 이용해 DATA 2 파일에 라인번호를 표시해 보겠습니다.
$ sed ’=’ data2
1
This is the header line.
2
This is the first data line.
3
This is the second data line.
4
This is the last line.
$
그럼 이제 N과 's/\n/ /' 을 이용하여 두라인일 합치고 뉴라인 캐릭터를 공백으로 교체 해 봅시다.
$ sed ’=’ data2 | sed ’N; s/\n/ /’
1 This is the header line.
2 This is the first data line.
3 This is the second data line.
4 This is the last line.
$
이제 원하는 결과대로 표시가 되었 습니다.

마지막 라인 출력하기

로그 파일과 같이 매우 긴 파일에서 마지막 라인만 출력 하는 방법은 간단 합니다 라인의 마지막을 표시하는 '$'기호와 출력하는 명령어인 p명령을 붙여서 사용을 하면 됩니다.

예제를 통해 살펴 보도록 합시다.

$ sed -n ’$p’ data2
This is the last line.
$
파일의 마지막 라인을 보여 줍니다.
아래의 예제는 /etc/passwd 파일에서 두개의 라인을 한개의 라인으로 만드는 예제 입니다..
$ sed ’{
> :start ==> 파일의 마지막 까지 루프를 돌기기 위해 label을 설정 합니다.
> $q ==> 현재 라인이 마지막 라인이면 스크립트를 종료 합니다.
> N ==> pattern space에 다음라인을 추가 합니다.
> 11,$D ==> 라인이 11번째 라인이면 첫번빼 라인을 삭제 합니다.(pattern space 10개)
> b start ==> start로 loop를 돌립니다.
> }’ /etc/passwd
mysql:x:415:416:MySQL server:/var/lib/mysql:/bin/bash rich:x:501:501:Rich:/home/rich:/bin/bash katie:x:502:506:Katie:/home/katie:/bin/bash jessica:x:503:507:Jessica:/home/jessica:/bin/bash testy:x:504:504:Test account:/home/testy:/bin/csh barbara:x:416:417:Barbara:/home/barbara/:/bin/bash ian:x:505:508:Ian:/home/ian:/bin/bash emma:x:506:509:Emma:/home/emma:/bin/bash bryce:x:507:510:Bryce:/home/bryce:/bin/bash test:x:508:511::/home/test:/bin/bash
$

라인 지우기

sed 에디터의 다른 유용한 유틸리티는 원하지 않는 라인을 삭제 하는 것 입니다.

그럼 아래 예제를 통해 하나 하나 살펴 보도록 합시다.

연속된 공백 라인을 삭제 하는 예제를 봅시다.
$ cat data6
This is the first line.
This is the second line.
This is the third line.
This is the fourth line.
$ sed ’/./,/^$/!d’ data6 ==> /./ 한개의 문자로 시작하는 /^$/ 데이터 스트림의 시작과 끝라인에서
마지막 라인을 제외한 공백 라인 삭제
This is the first line.
This is the second line.
This is the third line.
This is the fourth line.
$
첫번째 문자가 존재 하는 라인 이전에 공백라인이 있는 경우 삭제 하는 스크립트는 아래와 같습니다.
$ cat data7
==> 공백라인
This is the first line.
==> 공백라인
This is the second line.
$ sed ’/./,$!d’ data7 ==> 한개이상의 문자로 시작하는 문장과 라인의 끝사이의 라인은 불삭제
This is the first line.
This is the second line.
$
라인의 마지막에 공백라인이 여러개 있는경우 삭제 하는 스크립트 입니다.
$ cat data8
This is the first line.
This is the second line.
==> 3개의 공백라인
$ sed ’{
:start ==> 루프 시작 지점을 지정
/^\n*$/{$d ; N; b start } ==> 뉴케릭터 라인이 있는 라인에서 $d(마지막 라인)이면 삭제
마지막 라인이 아니면 두개의 라인을 한개의 라인으로(N)
start로 실행위치 변경(b start)
}’ data8
This is the first line.
This is the second line.
$
HTML Tag 제거 하기
WEB 페이지로 부터 데이터를 다운로드 받는경우 tag값을 같이 다운로드 받는 경우가 있습니다 .
이 경우 불필요한 tag를 제거하여 데이터 처리를 쉽게 할 수 있습니다.
$ cat data9
< html>
<head>
<title>This is the page title</title>
</head>
<body>
<p>
This is the <b>first</b> line in the Web page. This should provide
some <i>useful</i> information for us to use in our shell script.
</body>
</html>
$
$ sed ’s/<[^>]*>//g;/^$/d’ data9
This is the page title
This is the first line in the Web page.
This should provide some useful information for us to use in our shell script.
$

지금까지 sed의 추가 기능에 대해 알아 보았 습니다. 다음 Chapter에서는 gawk의 추가 기능들에 대해서 자세히 알아 보도록 하겠 습니다.

728x90
반응형

'쉘스크립트' 카테고리의 다른 글

Database 이용하기  (0) 2022.07.06
Advance gawk  (0) 2022.07.06
정규 표현식  (2) 2022.07.06
sed와 gawk의소개  (2) 2022.07.06
스크립트에서 그래픽 사용하기  (1) 2022.07.06