[linux/unix] sed (개념 & 명령어 & 옵션 & 정규식/메타문자 & 플래그 & 출력/치환/삭제/읽기 및 쓰기 예제 & 문제 풀이)
2022. 4. 10. 15:55ㆍOperatingSystem
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