[쉘 스크립트] 쉘 스크립트 기초 - sed 활용 예제 (11)
카테고리: Linux
태그: Linux
🎯sed 편집기 활용 예제
- 두 줄 간격으로 띄우기
- 빈 칸이 있을 수 있는 파일의 간격 조정
- 파일에 줄 번호 매기기
- 마지막 줄 출력하기
- 줄 지우기
- 연속된 빈 줄 지우기
- 시작 부분의 빈 줄 지우기
- 끝에 있는 빈 줄 지우기
- HTML 태그 없애기
두 줄 간격으로 띄우기
텍스트 파일의 줄 사이에 빈 줄을 삽입하는 간단한 sed 스크립트로 시작해보자.
$ cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$ sed 'G' data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
- 이 스크립트의 핵심은 대기 영역의 기본 값이 빈 줄이라는 것이다.
G명령은 대기 영역의 내용을 패턴 영역에 추가한다.- 파일의 끝 부분에 빈 줄을 없애고 싶다면 부정형 기호와 마지막 줄 기호를 쓴다
$!G
빈 칸이 있을 수 있는 파일의 간격 조정
어떤 텍스트 파일이 이미 몇 군데에 빈 줄이 있지만 모든 줄을 두 줄 간격으로 만들고 싶다면? 이전의 스크립트를 사용하면 기존의 빈 줄이 각각에도 빈 줄이 하나씩 더 들어가므로 몇몇 곳에서는 빈 줄이 너무 많아질 것이다.
이 문제에 대한 해결책은 먼저 데이터 스트림에서 빈 줄을 지운 다음 G 명령을 사용해서 새로운 빈 줄을 삽입하는 것이다. 기존의 빈 줄을 지우려면 d 명령을 빈 줄과 일치하는 패턴과 함께 사용하면 된다.
$ cat data.txt
This is line number 1
This is line number 2
This is line number 3
This is line number 4
$ sed '/^$/d ; $!G' data.txt
This is line number 1
This is line number 2
This is line number 3
This is line number 4
파일에 줄 번호 매기기
방법 1
$ sed '=' data2.txt
1
This is the header line.
2
This is the first data line.
3
This is the second data line.
4
This is the last line.
방법 2
방법 1은 줄 번호가 데이터 스트림의 실제 줄 위에 있기 때문에 읽기에 어색할 수 있다. 더 나은 해법은 텍스트와 같은 줄에 줄 번호를 놓는 것이다. 먼저 등호 명령의 결과를 얻은 다음, 두 줄을 결합하는 N 명령을 사용하는 또 다른 sed 편집기 스크립트로 그 출력을 파이프하여 이 문제를 해결할 수 있다.
$ sed '=' data2.txt | sed 'N ; s/\n/ /'
1 This is the header line.
2 This is the first data line.
3 This is the second data line.
4 This is the last line.
Note: bash에는 cat, nl과 같이 줄 번호를 더할 수 있는 유틸리티가 있다.
마지막 줄 출력하기
지금까지는 데이터 스트림에 있는 모든 줄 또는 특정 패턴과 일치하는 줄만을 출력하기 위한 p 명령을 사용하는 방법을 살펴보았다. 하지만 로그 파일 같은 긴 목록의 마지막 몇 줄만 보고 싶다면?
롤링 윈도우
해답은 롤링 윈도우를 만드는 것이다. 롤링 윈도우는 N 명령을 사용하여 조합한 패턴 영역 안의 텍스트 행의 블록을 다루기 위해 널리 쓰이는 방법이다.
N: 패턴 영역에 이미 있는 텍스트에 다음 줄의 텍스트를 추가한다..D: 패턴 영역의 첫 번째 행을 지운다.q: 루프를 종료한다.
$ cat data.txt
This is line number 1
This is line number 2
This is line number 3
This is line number 4
This is line number 5
This is line number 6
This is line number 7
This is line number 8
This is line number 9
This is line number 10
This is line number 11
This is line number 12
This is line number 13
This is line number 14
This is line number 15
$ sed '{
> :start
> $q ; N ; 11,$D
> b start
> }' data.txt
This is line number 6
This is line number 7
This is line number 8
This is line number 9
This is line number 10
This is line number 11
This is line number 12
This is line number 13
This is line number 14
This is line number 15
스크립트의 첫 번째 줄은 데이터 스트림의 마지막 줄인지를 검사한다. 마지막 줄이라면 종료 명령으로 루프를 중단한다($q). N 명령은 패턴 영역에 있는 현재 줄에 다음 줄을 추가한다. 11,$D 명령은 현재 줄이 10번째 줄 이후라면 패턴 영역의 첫 번째 행을 지운다.
줄 지우기
연속된 빈 줄 지우기
연속된 빈 줄을 없애는 가장 쉬운 방법은 주소 범위를 사용하여 데이터 스트림을 검사한느 것이다. 이전 장의 지우기 명령에서 주소 범위에 패턴을 결합시키는 방법을 보았다. sed 편집기는 지정된 주소 범위 안에서 일치한느 모든 줄에 대해 명령을 실행한다.
연속된 빈 줄을 지우기 위한 열쇠는 빈 줄이 아닌 줄과 빈 줄을 포함하는 주소 범위를 만드는 것이다. sed 편집기가 이 범위에 오면 줄을 지우지 말아야 한다. 반면 그러한 범위와 일치하지 않는 줄이라면 줄을 지워야 한다.
$ cat data.txt
This is line one
This is line two
This is line three
This is line four
$ sed '/./,/^$/!d' data.txt
This is line one
This is line two
This is line three
This is line four
시작 부분의 빈 줄 지우기
데이터 스트림의 앞에 있는 빈 줄을 제거하는 것은 어렵지 않다. 스크립트는 어떤 줄을 지울지를 판단하기 위해 주소 범위를 사용한다. 범위는 문자를 포함한 줄로 시작해서 데이터 스트림의 끝까지 이어진다. 이 범위 안에 들어가는 모든 줄은 출력에서 삭제되지 않는다.
$ cat data.txt
This is line one
This is line two
$ sed '/./,/$/!d' data.txt
This is line one
This is line two
끝에 있는 빈 줄 지우기
끝에 있는 빈 줄을 지우는 일은 처음에 나오는 빈 줄을 지우는 것만큼 간단하지 않다. 설명을 시작하기 전에 먼저 스크립트가 어떤 식인지 보자.
$ cat data.txt
This is the first line
This is the second line
$ sed '{
> :start
> /^\n*$/{$d ; N ; b start}
> }' data.txt
This is the first line
This is the second line
명령의 그룹은 지정된 주소 패턴에 적용된다. 주소 패턴은 줄바꿈 문자만 포함된 줄과 일치한다. 이러한 줄을 찾았을 때 이것이 마지막 줄이면 삭제 명령이 그 줄을 지운다. 마지막 줄이 아니라면 N 명령은 다음 줄을 결합하고 분기 명령이 처음으로 돌아가서 되풀이 한다. 결국 줄바꿈 문자로만 이루어진 줄들은 하나로 결합되고 마지막 줄에 다다랐을 때 제거된다.
📖출처
리처드 블룸, 크리스틴 브레스, ⌜리눅스 커맨드라인 쉘 스크립트 바이블⌟, 스포트라잇북(2016)
👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄
댓글남기기