개인/리눅스

[리눅스] sed 명령어의 기본적인 사용방법 두번째

OmeGa2 2023. 5. 3. 23:42

편집기와 비슷한 기능을 가지고 있는 sed 명령어의 다양한 사용방법을 알아보는 두 번째 페이지입니다. 지난번에는 간단하게 파일에서 특정 문자를 다른 문자로 치환하거나, 공백을 제거하는 등의 내용을 알아보았다면 이번에는 행 단위로 관리하는 내용을 중점적으로 보고자 합니다.

 

 

 

 

 

sed 명령어의 기본적인 사용방법 두 번째

 

먼저 sed 명령어를 처음 알아볼 때는 파일에서 문자열의 치환, 공백제거, 행에서 특정부분의 내용 삭제 등을 알아보았습니다. 해당 내용이 궁금하다면 아래 링크를 통해 확인할 수 있습니다.

 

▶ sed 명령어의 기본적인 사용방법 첫번째

 

이번 페이지에는 sed 명령어를 통해 행 단위로 파일을 수정하거나 관리하고자 합니다. 이에 앞서 파일의 행 번호를 확인하는 방법을 먼저 익혀두는 과정이 필요합니다.

 

 

※ sed 명령어의 기본 형식

 

]# sed [패턴] [파일명]

sed 명령어는 특정 파일에서 원하는 패턴을 적용한 뒤 출력문을 확인할 수 있는 명령어입니다. 패턴을 적용한 결과를 확인하여 원본 파일의 내용 또한 수정할 수 있습니다. 패턴은 따옴표 ' ' 안에 입력하며 여러 패턴을 동시에 적용할 수도 있습니다.

 

 

 

※ 파일의 행 단위 관리를 위한 행 번호 확인방법

 

]# vim [파일명]

:set nu  // 행 번호 생성

:set nonu  // 행 번호 제거

 

]# cat -n [파일명]

= 해당 파일의 내용을 행 번호와 함께 출력 (행 번호 -n옵션)

 

파일을 행 단위로 관리하기 위해서는 행 번호를 확인하는 것이 먼저입니다. 행 번호는 vim 편집기 혹은 cat 명령어를 통해 확인할 수 있습니다.

 

vim편집기로 파일을 수정하는 화면으로 들어가서 콜론 (:)과 함께 'set nu'를 입력하면 행 번호가 생성됩니다. 또한 단순히 파일의 내용을 확인하는 cat 명령어에서 -n옵션을 추가하면 행 번호와 함께 내용을 확인할 수 있습니다.

 

 

 

 


 

 

 

 

sed 명령어를 통해 행단 위로 파일 관리하기

 

여러 패턴을 이용한 sed 명령어를 사용하기에 앞서 먼저 원본파일을 확인하였습니다. 원본파일은 sed_comand 폴더 안에 test라는 이름으로 들어있습니다.

 

※ 원본파일 test 확인

원본파일
원본파일

cat -n 명령어를 통해 행 번호까지 출력하여 확인한 결과 총 1~5 행으로 이루어져 있는 것을 알 수 있습니다. 이 파일을 사용하여 여러 예시를 들어 sed 명령어의 패턴을 적용해보려고 합니다.

 

 

 

 

 

 

1. 파일의 특정 행만 출력 (여러 행 가능)

 

2번행만_출력
2번 행만 출력
2번부터4번행까지_출력
2~4번행 모두 출력
2번부터4번행까지_출력_원본파일수정
2~4번행까지 출력하면서 원본 파일 수정

 

]# sed -n '2p' test          // test파일에서 2번 행만 출력

]# sed -n '2,4p' test       // test파일에서 2,3,4번 행 모두 출력

]# sed -i -n '2,4p' test    // test파일에서 2,3,4번 행을 제외하고 모두 삭제 후 출력

 

sed -n 명령어는 특정 행만 출력해 주는 명령어입니다. 패턴이 들어가는 따옴표 ' ' 안에 행의 번호와 p옵션을 붙여 원하는 행만 출력할 수 있습니다.

 

-i 명령어를 사용하면 해당 패턴의 출력결과와 동일하게 원본 파일을 수정할 수 있습니다. [sed -i -n '2,4p' test] 명령어를 사용한 뒤 원본파일을 확인해 본 결과 2~4번 행을 남겨두고 모두 삭제된 것을 확인하였습니다.

 

여러 행을 출력하고 싶다면 숫자 사이에 쉼표 (,)를 이용하여 그 사이 모든 행을 출력할 수 있습니다.

 

 

 

 

 

 

 

2. 파일의 특정 행 삭제하기

 

5번행_삭제
5번행 삭제하기
3번부터5번행까지_삭제
3~5번행 삭제하기
3번부터_끝행까지_모두삭제_원본파일수정
3~끝행까지 모두 삭제하면서 원본파일 수정

 

]# sed '5d' test         // test파일의 5번 행 삭제

]# sed '3,5d' test      // test파일의 3~5번 행 모두 삭제

]# sed '3,$d' test      // test 파일에서 3번부터 끝행까지 모든 행 삭제

]# sed -i '3,$d' test   // test 파일에서 3번부터 끝행까지 삭제하면서 원본파일 수정하기

 

패턴에 행번호 뒤에 'd' 문자를 붙이면 해당 행을 삭제하는 패턴을 사용할 수 있습니다. 1번과 마찬가지로 쉼표로 구분하여 가운데 여러 행을 한 번에 삭제할 수 있습니다.

 

또한 달러표시 ($)는 끝부분을 의미합니다. 따라서 3,$ 를 사용한다면 3번부터 끝까지 라는 의미를 가지게 되며 3번부터 끝행까지 모두 삭제해 주는 패턴이 됩니다.

 

역시나 마찬가지로 -i 옵션을 이용하여 해당 패턴의 출력문대로 원본파일을 수정할 수 있습니다.

 

 

 

 

 

 

3. 원하는 행의 문자만 치환하기

 

3번행의_User문자를_aaa로_변경
3번행의 문자를 치환하기
1번과3번행의_2023숫자를_aaa로_변경
1번과 3번행의 문자를 치환하기

 

]# sed 's/111/222/g'                  // 문자 치환의 기본형식으로 111을 222로 변경

]# sed '3s/User/aaa/g' test       // test 파일의 3번 행에 있는 User을 aaa로 변경

]# sed '2,4s/User/aaa/g' test    // test파일의 2~4번 행 모두 User을 aaa로 변경

 

문자를 치환하는 기본적인 형식은 's///g'입니다. 슬러쉬 (/)를 기준으로 바꾸기 전의 문자와 바꾸고 난 후의 문자를 구분하여 치환할 수 있습니다.

 

여기서 s 구문은 바꾸고 싶은 행의 번호를 말합니다. 아무런 숫자가 없는 경우 모든 행이 해당합니다.

 

마지막으로 g 구문은 전체 파일을 수정할지 여부를 결정합니다. 기본적으로 sed는 한 횡을 읽고, 첫 번째로 패턴에 해당하는 부분에 패턴을 적용합니다.

 

g 구문을 사용하는 경우 해당 행에서 패턴에 해당하는 부분을 모두 수정할 수 있습니다. 한 행에서 치환해야 되는 부분이 여러 개가 있다면 g 구문이 꼭 필요합니다. 

 

 

 

 

 

 

4. 기타 sed명령어에서 자주 사용하는 옵션

 

sed 명령어를 사용하면서 자주 접하게 되는 명령어로 대소문자구분, 두 가지 패턴을 동시에 적용하기 등이 있습니다. 해당하는 명령어와 그에 대한 예시를 함께 보고자 합니다.

 

 

※ 두 가지 패턴을 동시에 적용

 

두가지_패턴_동시적용
두 가지 패턴 동시에 적용하기

]# sed -e [패턴] [파일명] -e [패턴] [파일명]

]# sed -n -e '1p' test -e '4p' test

= test 파일에서 1번과 4번 행 동시 출력

 

한 번에 하나의 패턴만 적용할 수 있는 sed 명령어에서 두 가지 이상의 패턴을 동시에 사용하기 위해서는 -e 옵션을 이용해야 합니다.

 

 

 

 

※ 두 가지 패턴을 순차적으로 적용

 

두가지패턴_순차적으로_적용
두 가지 패턴을 순차적으로 적용하기

]# sed -n [패턴] [파일명] | sed -n [패턴]

]# sed -n '2,4p' test | sed -n '1p'

= 2~4번 행 출력 후 그중에서 다시 1번 행 출력

 

sed 명령어 또한 파이프라인 ( | )을 통해 여러 번 명령어를 사용할 수 있습니다. 파이프라인은 [Shift + 역슬러쉬 혹은 달러표시]로 이용할 수 있습니다.

 

sed 명령어를 이용해 패턴을 순차적으로 적용할 때는 두 번째 패턴은 원본 파일이 아닌, 첫 번째 패턴이 적용된 출력문에서 다시 한번 패턴을 적용하게 됩니다.

 

명령어가 익숙해지면 이렇게 패턴을 여러 번 걸쳐 원하는 데이터를 가져올 수 있습니다.

 

 

 

 

※ 문자열 치환 시, 대소문자 구분 없이 치환하기

 

대소문자구분없이_치환하기
대소문자를 구분하지 않고 치환하기

]# sed 's/변경 전/변경 후/gI' [파일명]

]# sed 's/user/aaa/gI' test

= gI에서 I는 영어 알파벳 i의 대문자를 사용

 

기본적으로 sed 명령어는 대소문자를 구분합니다. 이를 대소문자 구분 없이 이용하기 위해서는 I 구문을 사용해야 합니다. 이는 영어 알파벳 i 의 대문자를 말합니다.

 

sed 명령어를 통해 문자를 치환할 때, 패턴에 해당하는 모든 문자를 적용하는 g 구문과 더불어 I를 사용한다면 대소문자 구분 없이 패턴이 적용되는 것을 확인할 수 있습니다.

 

 

 

 

※ 문자가 완전히 일치하는 경우에만 치환

 

문자열이_완전히_일치하는경우_치환하기
문자열이 완전히 일치하는 경우 치환하기

]# sed 's/\b문자열\b/ /g' [파일명]

]# sed 's/\bright\b/ /g' test

= test 파일에서 right와 완전히 일치하는 부분만 공백으로 치환

 

문자열 치환 시 사용되는 문자들은 모두 독립된 문자가 아니더라도 패턴이 적용됩니다. 이는 원하지 않는 부분까지 치환될 수도 있는 위험이 있습니다.

 

sed 명령어를 사용하여 문자를 치환할 때 완전히 일치하는 독립된 문자열만 바꾸고 싶은 경우 문자열 앞, 뒤에 \b 구문을 붙여야 합니다.

 

 

▶ [리눅스] grep 명령어의 기본적인 사용방법

▶ [리눅스] for문 한 줄로 사용하기