linux를 쓰다보면 여러가지 설정 파일 내용을 바꿀일이 많다.
텍스트 편집 내용이 반복적이라면 스크립트를 써서 자동화할 수 있는데, 그럴 때 sed 명령어를 자주 쓰게 된다.
기본 사용법은 여러군데 나와있지만, 실제 스크립트를 활용할때 내가 원하는대로 동작하는지 확신을 가지기 위해 테스트를 한번씩 더 하게 된다.
아래는 기본 sed 사용법들에 대해 여러가지 테스트한 내용 결과이다.
특정 문자열을 원하는 문자열로 바꾸기
수정전
aaa bbb ccc aaa bbb ddd
bbb ggg fff aaa kkk
명령어 : 'aaa'를 '333'으로 바꾸기
sed -i 's/aaa/333/' test
수정후
333 bbb ccc aaa bbb ddd
bbb ggg fff 333 kkk
: -i 옵션을 사용하면 파일 내용이 수정되고, -i를 제외하면 수정된 내용 출력만하고 실제 파일 내용은 바뀌지 않는다.
: 결과를 보면 첫 줄에 aaa가 두번 있는데 앞 쪽만 바뀌었다. 위 명령어는 한 줄에 한 번만 실행됨을 알 수 있다.
특정 문자열을 원하는 문자열로 바꾸기 - 모든 문자열 바꾸기
수정전
aaa bbb ccc aaa bbb ddd
bbb ggg fff aaa kkk
명령어 : 'aaa'를 '333'으로 바꾸기
sed -i 's/aaa/333/g' test
수정후
333 bbb ccc 333 bbb ddd
bbb ggg fff 333 kkk
: 결과를 보면 모든 'aaa'가 '333'으로 교체되었다.
line 지우기
수정전
aaa bbb ccc aaa bbb ddd
bbb ggg fff aaa kkk
명령어 : 첫줄 삭제
sed -i '1d' test
수정후
bbb ggg fff 333 kkk
특정 line 지우기
수정전
aaa bbb ccc aaa bbb ddd
bbb ggg fff aaa kkk
명령어 : 2번째 line 삭제
sed -i '2d' test
수정후
aaa bbb ccc aaa bbb ddd
여러 line 지우기
수정전
aaa bbb ccc aaa bbb ddd
bbb ggg fff aaa kkk
a11a b22b c33c d44d
5aa5 6bb6
222
명령어 : 두번째 줄부터 4번째 줄까지 삭제
sed -i '2,4d' test
수정후
aaa bbb ccc aaa bbb ddd
222
특정 문자 다음 문자열 내용을 모를때 원하는 문자열로 바꾸기
수정전
variable = 1
variable = 11
variable = a1
명령어 : variable 의 값 첫번째 문자열을 9로 바꾸고 싶을때
sed -i 's/variable = ./variable = 9/' test
수정후
variable = 9
variable = 91
variable = 91
'.'은 한 글자를 의미
특정 문자 다음 문자열 내용을 모를때 원하는 문자열로 바꾸기
수정전
variable = 1
variable = 11
variable = a1
명령어 : variable 의 값 두글자를 9로 바꾸고 싶을때
sed -i 's/variable = ../variable = 9/' test
수정후
variable = 1
variable = 9
variable = 9
첫번째 줄은 바뀌지 않았다. '..'을 입력했으므로 두글자가 있는 경우만 그 두글자를 9로 바꾼다.
무슨 숫자이건 내가 원하는 값으로 바꾸기
수정전
variable = 111
variable = 2222
variable = 12aa
variable = aa12
variable =
명령어 : variable 의 값 중 숫자를 99999로 바꾸기
sed -i 's/variable = [0-9]*/variable = 99999/' test
수정후
variable = 99999
variable = 99999
variable = 99999aa
variable = 99999aa12
variable =
값이 숫자로 시작하는 경우는 숫자부분만 99999로 바뀌었다.
문자로 시작하는 경우 99999가 앞에 덧붙여졌다.
값이 없는 경우는 변화가 없다.
무슨 문자이건 내가 원하는 값으로 바꾸기
수정전
variable = 111
variable = 2222
variable = 12aa
variable = aa12
variable =
명령어 : variable 의 값 중 문자를 kkk로 바꾸기
sed -i 's/= [a-z]*/= kkk/' test
수정후
variable = kkk111
variable = kkk2222
variable = kkk12aa
variable = kkk12
variable =
값이 문자로 시작하는 경우는 숫자부분만 kkk로 바뀌었다.
숫자로 시작하는 경우 kkk가 앞에 덧붙여졌다.
값이 없는 경우는 변화가 없다.
특정 문자열 뒤에 줄 추가하고 원하는 문자열 추가하기
수정전
variable = 111
variable = 2222
variable = 12aa
variable = aa12
variable =
명령어 : 2222아래에 한줄 추가하고 'add' 문자 추가하기
sed -i 's/2222/2222\nadd/' test
수정후
variable = 111
variable = 2222
add
variable = 12aa
variable = aa12
variable =
줄바꿈을 문자로 치환하기
수정전
123
456
789
123
456
789
123
456
789
123
456
789
123
456
789
123
456
789
명령어 : '123'과 '456'을 한줄에 출력하고 사이에 ':'추가하기
sed -i 'N;s/123\n456/123:456/' test
수정후
123:456
789
123
456
789
123:456
789
123
456
789
123:456
789
123
456
이상하게 한번 건너뛰면서 실행된다.
명령어 : '123'과 '456'을 한줄에 출력하고 사이에 ':'추가하기(2)
sed -i 'N;N;s/123\n456/123:456/' test
수정후
123:456
789
123:456
789
123:456
789
123:456
789
123:456
789
123:456
789
모든 line에 적용되었다.
명령어 : '123'과 '456', '789'를 한줄에 출력하고 사이에 ':'추가하기(2)
sed -i 'N;N;s/123\n456\n789/123:456:789/' test
수정후
123:456:789
123:456:789
123:456:789
123:456:789
123:456:789
123:456:789
바꾸고 싶은 대상 문자열에 줄바꿈이 두번 이상있으면 'N;'를 그 수만큼 반복해서 써준다.
공백을 원하는 문자로 치환하기
수정전
aaa bbb
aaa bbb
aaa bbb
aaa bbb
명령어 : 공백을 'c'로 치환하기
sed -i 's/\s\+/c/' test
수정후
aaacbbb
aaacbbb
aaacbbb
aaacbbb
탭을 포함하여 한 칸이상의 공백을 치환할 수 있다.
괄호 활용하기
수정전
aaa1234567890ddd
명령어 : 숫자 앞뒤 텍스트 바꾸기
sed -i 's/aaa\(1234567890\)ddd/bbb\1ccc/' test
수정후
bbb1234567890ccc
괄호를 활용하여 숫자를 반복해서 쓰지 않아도 된다.
0 댓글