편집기와 비슷한 기능을 가지고 있는 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. 파일의 특정 행만 출력 (여러 행 가능)
]# 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. 파일의 특정 행 삭제하기
]# 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. 원하는 행의 문자만 치환하기
]# 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 구문을 붙여야 합니다.
'개인 > 리눅스' 카테고리의 다른 글
[리눅스] awk 명령어의 기본적인 사용방법 (print 함수) (0) | 2024.06.20 |
---|---|
[리눅스] sed 명령어의 기본적인 사용방법 (1) | 2022.10.18 |
[리눅스]for 문 한줄로 사용하기 (0) | 2020.04.29 |
[리눅스] grep 명령어의 기본적인 사용방법 (0) | 2020.03.22 |
[리눅스] VNC란? 사용목적과 설치 (0) | 2020.02.29 |