[linux/unix] sed (개념 & 명령어 & 옵션 & 정규식/메타문자 & 플래그 & 출력/치환/삭제/읽기 및 쓰기 예제 & 문제 풀이)

2022. 4. 10. 15:55OperatingSystem

728x90
728x90

sed 개념 정리.

  • linux/unix에서 제공하는 유틸리티로, 문자열/파일을 수정(치환, 삭제, 삽입 ….)하여 출력해주는 기능을 제공함.
  • 대화식 처리가 아닌, 명령행에서 직접 편집을 수행함.
  • 원본 파일은 변경되지 않음.
  • 정규 표현식을 사용하여, 편집하려는 행을 검색/선택할 수 있음.
  • 패턴 검색/선택을 위해서 다수의 메타문자를 사용할 수 있음.
  • 파일을 한 행(line)씩 읽을 수 있음.
  • 패턴 스페이스, 홀드 스페이스 두 가지 버퍼를 사용함.
  • 패턴 스페이스에는 현재 작업중인 라인을 저장함.
  • 여러 라인들을 처리(변환/치환)해야하는 경우, 처리할 라인을 홀드 스페이스에 저장함.

sed의 명령어 처리 방식.


sed 옵션 정리 .

옵션 기능
-e 다중 편집을 가능하게 한다.
2개 이상의 패턴을 사용하는 경우에 사용한다.
-n 자동 출력을 생략한다.(기본 동작은 문자열/파일의 전체 출력.)
변경한 라인만 출력하고 싶은 경우에 사용한다.

sed 정규식/메타문자 정리.

정규식(메타문자) 기능 사용 예 사용 예 설명
^ 행의 시작 지시자 /^love/ love로 시작하는 문자 검색.
$ 행의 끝 지시자 /love$/ love로 끝는 문자 검색.
. 하나의 문자와 대응 /l…e/ l 다음의 두 문자 후 e로 끝나는 문자 검색.
* 선행 문자와 같은 문자의 0개 혹은 임의 개수와 대응 /*love/ 0개 혹은 여러 개의 공백후 love로 끝나는 문자 검색.
[] []사이의 문자 집합중 하나와 대응 /[Ll]ove/ love나 Love를 포함하는 문자 검색.
[^] 문자 집합에 속하지 않는 한 문자와 대응 /[^A-KM-Z]ove/ A~K, M~Z범위에 포함되지 않는 문자 이후 ove로 끝남
\(..\) 문자열을 저장 s/\(lov\)able/\1er/ 지정된 부분을 태크1에 저장함.
loveable을 검색 후 lover로 저장.
& 검색열을 저장하여 치환열에서 사용할수 있게 함. s/love/**&**/ 문자열 love가 &와 치환됨
\< 단어의 시작 지시자 /\<love/ love로 시작하는 단어를 포함하는 행을 검색.
\> 단의 끝 지시자 /love\>/ love로 끝나는 단어를 포함하는 행을 검색.
x\{m\} 문자 x를 m번 반복 /o{5\}/ 문자 o를 5번 반복 검색.
x\{m,\} 문자 x를 최소 m번 반복 /o{5,\}/ 문자 o를 최소 5번 반복 검색.
x\{m,n\} 문자 x를 m~n회 반복 /o{5,10}/ 문자 o를 5~10번 반복 검색.

sed 플래그/커맨드.

플래그 기능
a\ 현재 행에 하나 이상의 새로운 행을 추가한다.
c\ 현재 행의 내용을 새로운 내용으로 교체한다.
i\ 현재 행의 위에 텍스트를 삽입한다.
h 패턴 스페이스의 내용을 홀드 스페이스에 복사한다.
H 패턴 스페이스의 내용을 홀드 스페이스에 추가한다.
g 홀드 스페이스의 내용을 패턴 스페이스에 복사한다.
G 홀드 스페이스의 내용을 패턴 스페이스에 추가한다.
l 출력되지 않는 특수문자를 명확하게 출력한다.
n 다음 입력 행을 첫 번째 명령어가 아닌 다음 명령어에서 처리하게 한다.
! 선택된 행을 제외한 나머지 전체 행에 명령어를 적용한다.
r 파일을 읽어온다.
d 행을 삭제한다.
p 행을 출력한다.(전체 데이터 출력.)
s 문자열을 치환한다.

sed 치환 플래그.

치환 플래그 기능
g 문자열/파일내에 모든 패턴들을 검색하고 전체에 대해 치환한다.
i 대소문자를 무시하고 실행한다.
p 치환된 행만을 출력한다.
w 파일에 쓴다.
x 홀드 버퍼와 패턴 스페이스의 내용을 서로 맞바꾼다.
y 한 문자를 다른 문자로 변환한다

sed 출력 예시.

출력 예시 설명
$ sed -n '1p' [filename/text] 첫 번째 행만 출력.
$ sed -n '8,$p' [filename/text] 8 line부터 파일 끝까지 출력.($은 파일의 끝을 의미.)
$ sed -n '/west/p' [filename/text] west가 포함된 행들을 찾고 출력.(-n 옵션은 검색/변경한 라인만을 출력함.)
$ sed -n '/west/,/east/p' [filename/text] west가 포함된 행과 east가 포함된 행 사이의 행들을 출력.
$ sed -n '3,/^west/p' [filename/text] 3번째 행부터 west로 시작되는 행까지 출력.

sed 치환 예시.

치환 예시 설명
$ sed s/mariadb/mysql [filename/text] 처음 나오는 mariadb를 mysql로 치환 후 전체 출력.
$ sed -n 's/mariadb/mysql/p' [filename/text] -n 옵션과 p 플래그에 의해 변경된 라인만 출력.
$ sed s/mariadb/mysql/g [filename/text] 모든 mariadb를 mysql로 치환
$ sed s/mariadb/mysql/gi [filename/text] 모든 mariadb를 mysql로 치환(대소문자를 무시함.)

sed 삭제 예시.

삭제 예시 설명
$ sed 8d [filename/text] 8번째 줄을 삭제한다.
$ sed /^$/d [filename/text] 빈 줄을 모두 삭제한다.
$ sed 1,/^$/d [filename/text] 첫 줄부터 처음 나타나는 빈 까지 삭제한다.
$ sed s/ *$// [filename/text] 모든 줄의 끝에 나오는 빈 칸을 삭제.
$ sed /was/d [filename/text] “was”를 포함하는 모든 줄을 삭제.
$ sed s/was//g [filename/text] “was”가 나오는 줄에서 “was”만 삭제.
$ sed s/ //g [filename/text] 모든 줄의 공백을 제거.

sed 읽기 및 쓰기 예시.

읽기 및 쓰기 예시 설명
$ sed '/north/r addfile' [filename/text] north가 발견된 다음 행에 addfile의 내용을 추가.
$ sed -n '/north/w outputfile' [filename/text] north라는 패턴이 포함된 행을 찾으면 찾은 행들을 outputfile에 저장.
$ sed 'a\\Hello World\!' [filename/text] 모든 라인 뒤에 'Hello World'를 추가.
$ sed '3a\\Hello World' [filename/text] 3번째 라인 뒤에 'Hello World'를 추가.
$ sed '/north$/a\Hello World' [filename/text] north로 끝나는 행을 찾아, 그 다음에 'Hello World을 추가.

sed 실습/예제 파일(datafile)을 통한 문제 풀이.

$ cat datafile
northwest       NW      Charles Main            3.0     .98     3       34
western         WE      Sharon Gray             5.3     .97     5       23
southwest       SW      Lewis Dalsass           2.7     .8      2       18
southern        SO      Suan Chin               5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage               4.4     .84     5       20
northeast       NE      AM Main Jr.             5.1     .94     3       13
north           NO      Margot Weber            4.5     .89     5        9
central         CT      Ann Stephens            5.7     .94     5       13

1. datafile의 'north' 패턴을 포함하는 행만 출력.

$ sed -n '/north/p' datafile
northwest       NW      Charles Main            3.0     .98     3       34
northeast       NE      AM Main Jr.             5.1     .94     3       13
north           NO      Margot Weber            4.5     .89     5        9

2. 3번째 행부터 마지막 행까지 삭제 후 출력.(원본 파일은 변경되지 않음.)

$ sed '3,$d' datafile
northwest       NW      Charles Main            3.0     .98     3       34
western         WE      Sharon Gray             5.3     .97     5       23

3. 'west'로 시작하는 단어를 'north'로 치환하고 치환된 행을 출력.

(s명령어는 치환을 위해 사용하며, –n옵션은 p 플래그와 함께 사용되어 치환이 일어난 행만을 출력함.)

$ sed -n 's/^west/north/p' datafile
northern         WE      Sharon Gray             5.3     .97     5       23

4. 1~3행을 지우고 'Hermenway'를 'Jones'로 치환해준다. (-e 옵션은 다중편집을 할수 있게 해줌)

$ sed -e '1,3d' -e 's/Hemenway/Jones/' datafile
southern        SO      Suan Chin               5.1     .95     4       15
southeast       SE      Patricia Jones       4.0     .7      4       17
eastern         EA      TB Savage               4.4     .84     5       20
northeast       NE      AM Main Jr.             5.1     .94     3       13
north           NO      Margot Weber            4.5     .89     5        9
central         CT      Ann Stephens            5.7     .94     5       13

5. 'Suan' 단어를 찾고 다음 행에 newfile의 내용을 출력한다.(r 명령어는 파일을 읽어오는 명령임.)

$ cat newfile 
GOMU92GOMU92GOMU92GOMU92GOMU92GOMU92GOMU92GOMU92

$ sed '/Suan/r newfile' datafile
northwest       NW      Charles Main            3.0     .98     3       34
western         WE      Sharon Gray             5.3     .97     5       23
southwest       SW      Lewis Dalsass           2.7     .8      2       18
southern        SO      Suan Chin               5.1     .95     4       15
GOMU92GOMU92GOMU92GOMU92GOMU92GOMU92GOMU92GOMU92
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage               4.4     .84     5       20
northeast       NE      AM Main Jr.             5.1     .94     3       13
north           NO      Margot Weber            4.5     .89     5        9
central         CT      Ann Stephens            5.7     .94     5       13

6. 패턴 north를 포함하는 행들이 newfile에 저장된다.(w 명령어는 사용자가 선택한 행들을 파일에 저장한다.)

$ sed -n '/north/w newfile' datafile

$ cat newfile 
northwest       NW      Charles Main            3.0     .98     3       34
northeast       NE      AM Main Jr.             5.1     .94     3       13
north           NO      Margot Weber            4.5     .89     5        9

7. 'Margot' 단어의 'Mar'를 태그 1로 레지스터에 저장하고 태그1 + ianne('Mar + ianne') 새로운 단어를 생성. 즉, 'Margot' 단어를 'Marianne'로 치환. 
\(..\) 괄호안의 패턴 Mar는 태그 1로 지정되어, 레지스터에 저장되며, 치환열에서 \1로 참조할수 있다.

$ sed -n 's/\(Mar\)got/\1ianne/p' datafile
north           NO      Marianne Weber            4.5     .89     5        9

8. 'WE' 포함된 행을 찾은 후 h명령어로 찾은 행을 홀드 스페이스로 복사하고 d명령어로 찾은 행을 삭제.
'CT' 포함된 행을 찾은 후 G명령어로 찾은 행의 다음 행에 홀드 스페이스 내용을 출력.

$ sed -e '/WE/{h; d;}' -e '/CT/{ G;}' datafile
northwest       NW      Charles Main            3.0     .98     3       34
southwest       SW      Lewis Dalsass           2.7     .8      2       18
southern        SO      Suan Chin               5.1     .95     4       15
southeast       SE      Patricia Hemenway       4.0     .7      4       17
eastern         EA      TB Savage               4.4     .84     5       20
northeast       NE      AM Main Jr.             5.1     .94     3       13
north           NO      Margot Weber            4.5     .89     5        9
central         CT      Ann Stephens            5.7     .94     5       13
western         WE      Sharon Gray             5.3     .97     5       23
728x90
728x90