본문 바로가기
컴퓨터 & IT (Computer & IT)/Linux

[Linux] sed 편집기

by UltraLowTemp-Physics 2021. 3. 29.
728x90

 1. sed란? 

• sed는 리눅스에서 많이 사용하는 커맨드라인 편집기이다. 
• 일반적인 대화형 텍스트 편집기와 반대 개념인 스트림 편집기*이다. 

대화형 텍스트 편집기 스트림 편집기
1. ex) vim,..
2. 데이터에 있는 텍스트의 삽입, 삭제 등의 일렬의 작업들을 키보드를 사용하여 상호작용으로 처리

1. ex) sed,...
2. 편집기가 데이터를 처리하기 전에 미리 제공받은 일련의 규칙에 따라 데이터를 처리
3. 대화형 편집기보다 처리과정이 빠름

• sed 편집기가 하는 일 
  (1) 입력 수단으로부터 한 번에 하나씩 데이터 줄을 읽어들임 
  (2) 제공된 편집기 명령으로 데이터를 대조 
  (3) 명령에서 지정된 대로 스트림의 데이터를 바꿈 
  (4) STDOUT으로 새로운 데이터를 출력  


2. sed의 기본 syntax: sed <options> <script> <file>  

■ sed의 옵션 

옵션 설명
-e 'scripts'  • sed 커맨드 라인에서 하나 이상의 명령어를 실행할 경우, -e 옵션을 사용함
• 각 명령어들은 세미콜론(;)으로 구분해야한다. 
• 명령과 세미콜론 끝 사이에 빈칸이 있으면 안된다. 
• 모든 명령어들은 홑따옴표 내부에서 작성해야한다. 
-f file • 입력을 처리하는 동안 실행 중인 명령에 파일에 지정된 명령을 추가한다. 
-n  • 각 명령에 대한 출력을 만들어내지는 않지만 print 명령을 기다림 

옵션의 예시 - 1) sed로 하나 이상의 명령어를 사용할 경우 

(1) 예시로 사용할 파일: data_1.txt 파일 

$ vim data_1.txt
Is this the real life?
Is this just fantasy?


(2) real → fake, fantasy → truth 로 변경 

$ sed -e 's/real/fake/; s/fantasy/truth/' data_1.txt
Is this the fake life?
Is this just truth?

Note: 위 예제에서 사용된 sed 명령어를 설명하면 아래와 같다. 
  a. sed -e: 해당 명령어를 통해, 리눅스의 터미널에서 작업을 하고 있음을 알 수 있다. 
  b. 's/real/fake' 
     - s: 텍스트 바꾸기 (아래의 3. Sed 기본 명령어 참조) 
     - 각 줄의 real을 fake로 변경하라는 의미
  c. 's/fantasy/truth' 
     - 각 줄의 fantasy를 truth로 변경하라는 의미 
  d. 읽을 파일: data_1.txt
  e. 주의: sed는 원본 파일을 수정하지 않는다.  


sed의 기본 명령어 

0) 출력하기: "p" command 
   • 텍스트 줄을 print함 
   • 전체 줄을 print : sed -n 'p' <file.txt> 
   • 파일의 특정 n번째 열만 출력: sed -n 'np' <file.txt>
   • 파일의 특정 n번째 열부터 m번째 열까지 출력: sed -n 'n,mp' <file.txt>
 
   • 파일의 특정 <pattern>을 가지는 열만 출력: sed -n '/<pattern>/p' <file.txt>  

1) 텍스트 바꾸기: "s" command  
 (1) syntax: s/pattern/replacement/flags 
   • pattern: 변경되는 문자열
   • replacement: pattern에서 바꿀 문자열 
   • flag: flag를 쓰지 않을 경우, 각 줄의 처음 나오는 문자열만 바꾼다. flag에는 다음 4가지를 사용할 수 있다. 
     - 숫자: 몇 번째로 나타나는 패턴을 새로운 텍스트로 바꿀지를 뜻함 
     - g: 기존의 텍스트에서 나타나는 모든 패턴을 바꿔야 한다는 것을 뜻함 
     - p: 원래 줄의 내용이 출력되어야 한다는 것을 의미 
     - w file: 바꾼 결과를 파일에 써야 한다는 것을 의미 

2) 문자 변경하기 
   • syntax: [address]y/inchars/outchars 
   • inchars에 대응되는 n번째 문자를 outchars에 대응되는 n번째 문자로 변경 
   • inchars와 outchars의 길이는 반드시 동일해야 함. 

3) 줄 삭제하기: "d" command 
   • 전체 줄 삭제: $ sed 'd' <file.txt> 
   • 특정 n번째 열 삭제: $ sed 'nd' <file.txt> 
   • 특정 n번째 열부터 m번째 열까지 삭제: $ sed 'n,md' <file.txt>
   • 특정 문자 <pattern>이 나타나는 모든 열 삭제: $sed '/<pattern>/d' <file.txt> 

4) 텍스트 삽입 및 첨부 
   • sed 명령은 두 가지 형태의 텍스트 삽입을 할 수 있다. 
      - insert(i): 지정된 줄 바로 앞에 새로운 줄을 추가 
      - append(a): 지정된 줄 바로 다음 줄에 새로운 줄을 추가 
   • syntx: sed '[address]command\newline'  

5) 줄 바꾸기 
   • 줄바꾸기 명령을 사용하면, 특정한 줄의 전체 내용을 바꿀 수 있음 
   • syntax: sed '[address]c\changed_line'  

예시 1) g flag : 

$ vim example.txt
apple apple apple apple apple
tomato tomato tomato apple tomato

$ sed 's/apple/banana/g' example.txt
banana banana banana banana banana
tomato tomato tomato banana tomato

 

예시 1) n flag : 

$ vim example.txt
apple apple apple apple apple
tomato tomato tomato apple tomato

$ sed 's/apple/banana/2' example.txt
apple banana apple apple apple
tomato tomato tomato apple tomato

 

2) 슬레쉬가 있는 문자열을 바꾸는 경우

sed 편집기에서 구분자를 '/'가 아닌 다른 특수문자로 사용한다. 
  - 가용한 특수문자의 예: !, |, ... 
  - 예시: /etc/passwd 파일에서 C 쉘을 Bash 쉘로 변경하는 경우 
     $ sed 's!/bin/bash!/bin/csh!' /etc/passwd

3) sed의 주소 

 - 일반적으로 sed 편집기는 텍스트 데이터의 모든 줄에 적용이 됨
 - 텍스트 데이트의 특정 줄 영역만 수정을 하는 경우에는 줄의 주소를 사용해야 함. 
 - 줄의 주소에는 아래와 같이 두 가지 형식이 있음
     a. 숫자 범위로 된 줄 
     b. 줄을 걸러낼 텍스트 패턴 
 - 주소를 사용하는 sed의 syntax :
     a. 명령하나만 사용하는 경우: [address] command 
     b. 여러 명령을 사용하는 경우 
        address { 
             command1
             command2 
             command3
         } 

  예시) 

$ vim example.txt
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
MELON apple apple apple apple

$ sed '2s/apple/lemon/g' example.txt
apple apple apple apple apple
lemon lemon lemon lemon lemon
apple apple apple apple apple
apple apple apple apple apple
MELON apple apple apple apple

$ sed '2,3s/apple/lemon/g' example.txt
apple apple apple apple apple
lemon lemon lemon lemon lemon
lemon lemon lemon lemon lemon
apple apple apple apple apple
MELON apple apple apple apple

$ sed '2,$s/apple/lemon/g' example.txt
apple apple apple apple apple
lemon lemon lemon lemon lemon
lemon lemon lemon lemon lemon
lemon lemon lemon lemon lemon
MELON lemon lemon lemon lemon

$sed '/MELON/s/apple/lemon/g' example.txt
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
MELON lemon lemon lemon lemon

※ Note: 
    - 2번째 줄만 바꾸는 경우: $sed '2s/apple/lemon/g' example.txt 
    - 2~3번째 줄만 바꾸는 경우: $sed '2,3s/apple/lemon/g' example.txt
    - 2~마지막 줄까지 바꾸는 경우: $sed '2,$s/apple/lemon/g' example.txt 
    - MELON이라는 문자가 나오는 줄만 변경: $sed '/MELON/s/apple/lemon/g' example.txt

텍스트 삽입의 예시 

$ sed '/MELON/i\new line' example.txt
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
new line
MELON apple apple apple apple

$ sed '/MELON/a\new line' example.txt
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
MELON apple apple apple apple
new line

 

줄바꾸기의 예시 

sed '/MELON/c\changed_line' example.txt
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
apple apple apple apple apple
changed_line

$ sed '2c\changed_line' example.txt
apple apple apple apple apple
changed_line
apple apple apple apple apple
apple apple apple apple apple
MELON apple apple apple apple

 

 


멀티라인 명령

sed 편집기는 여러 줄의 텍스트를 처리하기 위한 아래의 세 가지 명령어를 가지고 있다. 
   a. N(next): 멀티라인 그룹을 만들기 위해 데이터 스트림에서 다음 줄을 추가 
   b. D(delete): 멀티라인 그룹에서 한 줄을 삭제 
   c. P(print): 멀티라인 그룹의 한 줄을 인쇄 

1. N 예시

기본적으로 sed 편집기는 텍스트 파일에서 한 줄씩 읽어서 작업을 처리한다. 하지만, 가끔, 한 줄이 아닌 두 줄씩 처리를 할 경우가 필요하다. 이런 경우, 옵션 N을 사용하면 된다. 

- 옵션 N: sed 편집기가 텍스트 파일을 처리할 때, 두 줄씩 읽으면서 처리한다. 

Ref: https://www.baeldung.com/linux/sed-replace-multi-line-string

예시) 

$ vim example_files.txt
line 1: hello
line 2: Who are you?
line 3: You don't know me?
line 4: So, who are you sir?

# Example 1
$sed -e 'N;s/\n/ /;' example_files.txt
line 1: hello line 2: Who are you?
line 3: You don't know me?  line 4: So, who are you sir?

# Example 2
$ sed -e '1N;s/\n/ /;' example_files.txt
line 1: hello line 2: Who are you?
line 3: You don't know me?
line 4: So, who are you sir?

# Example 3
$ sed -e '2N;s/\n/ /;' example_files.txt
line 1: hello
line 2: Who are you? line 3: You don't know me?
line 4: So, who are you sir?

# Example 4
$ sed -e '3N;s/\n/ /;' example_files.txt
line 1: hello
line 2: Who are you?
line 3: You don't know me?  line 4: So, who are you sir?

Note: 
 - s옵션을 사용하여, 각 예제에서 줄바꿈 문자 "/n"가 화이트 스페이스 " "으로 바뀌었음을 주목

 

728x90

'컴퓨터 & IT (Computer & IT) > Linux' 카테고리의 다른 글

[Linux] screen 명령어  (0) 2021.04.27
[Linux] GPU 모니터링  (0) 2021.04.27
Shell script 명령어  (0) 2021.02.05
[Linux] NFS (Networking File System) 서버 설치  (0) 2020.11.15
[Linux] /etc/fstab  (0) 2020.11.15

댓글