3. OS이야기/03. Shell Script

[UNIX/LINUX] Shell Script - sed 명령을 이용한 new line <-> 특정 문자열 (2)

알 수 없는 사용자 2014. 5. 7. 13:22

지난 글에 이어서 이번에는 sed를 이용하여 new line을 특정 문자열로 변경하는 방법에 대해 말씀 드리도록 하겠습니다.

 

(2) new line --> 특정 문자열


# cat test.txt

11111

22222

33333

44444

55555



위와 같은 컨텐츠를 가진 txt 파일이 있다고 가정합니다.

 

위 컨텐츠에서 Enter가 적용된 부분(new line)을 ':'(colon)으로 변경하고자 한다면 다음과 같이 수행합니다.


# sed 'N;N;N;N;s/\n/:/g' test.txt



sed 명령에서 'N' 옵션은 줄바꿈문자(\n)를 /A패턴/ 공간에 더하고 입력의 다음 줄을 읽어 패턴 스페이스에 덧붙이겠다는 뜻입니다.

 

무슨 말인지 이해가 잘 되시나요?

 

사실 저는 아직도 완전히 이해가 되지는 않습니다.;;;;

 

문제 해결방안을 찾다보니 아래와 같이 한글로 된 URL을 찾았는데 그 글을 올리신 분이 정의해 놓은 것을 그냥 가져다 적은 것입니다.

(출처: http://wiki.kldp.org/Translations/html/Sed-KLDP/sedprograms.html#OVERVIEWOFREGULAREXPRESSIONSYNTAX)

 

아무튼 특정 문자열로 변경해야할 new line의 수만큼 'N' 옵션을 써주시면 되는데요.

 

이 옵션 사용 후 /A패턴/ 에 해당하는 부분에 개행문자인 '\n' 을 입력해 주시고 /B패턴/ 에 new line 대신 들어갈 문자열을 입력해 주시면 됩니다.

 

이렇게 하는 것이 제가 sed를 이용해서 new line을 특정 문자열로 변경하는 방법이라고 알아낸 것인데요.

 

한 가지 단점이..

 

위와 같은 예제에서 new line의 개수가 정확히 몇 개인지 확인이 가능하다면 모르겠지만, 개수 파악이 안되는 컨텐츠의 경우 어떻게 해야 할지 아직 찾지 못했습니다.;;;;

 

물론 'tr' 명령어를 사용하여 다음과 같이 구현해도 되긴 합니다.


cat test.out | tr "\n" ":" | cut -d ':' -f 1-5



하지만, 위 방법 역시도 '|'(pipe) 를 이용한 명령어의 길이가 길어지기도 하고 cut 명령 뒤에 '-f' 옵션으로 출력 컬럼을 정할 때에도 ':'(colon) 개수를 알아야만 한다는 단점이 있습니다.