sed 스트림 편집

LinuxBeginner
지금 연습하기

소개

Linux 에서 텍스트 파일을 다룰 때는 대화형 텍스트 편집기를 열지 않고 자동으로 편집해야 하는 경우가 많습니다. 예를 들어 CSV 파일에서 헤더를 제거하거나, 빈 줄을 삭제하거나, 로그 파일에서 특정 줄 범위를 추출해야 할 수 있습니다.

이러한 작업에는 sed(스트림 편집기) 를 사용합니다.

sed는 강력한 비대화형 텍스트 편집기입니다. 파일이나 파이프에서 입력을 읽고, 각 줄에 작업을 수행한 다음 결과를 출력합니다. 이러한 "읽기, 변환, 출력" 모델은 전통적인 Unix 방식이며 파이프라인에서 특히 유용합니다.

이 모델에서 스트림 편집기라는 이름이 유래했습니다. sed는 전체 화면 편집기처럼 파일을 열어 작업하는 것이 아니라, 흘러가는 텍스트를 처리하도록 설계되었습니다. 따라서 셸 파이프라인과 자동화 스크립트에 자연스럽게 연결할 수 있습니다.

이 실습에서는 다음 방법을 배웁니다.

  1. 줄 삭제 (d): 필요하지 않은 헤더나 주석을 제거합니다.
  2. 빈 줄 제거: 정규 표현식을 사용해 빈 줄을 필터링합니다.
  3. 텍스트 삽입 (i): 파일에 새 줄을 추가합니다.
  4. 줄 출력 (p): 특정 줄 범위를 추출합니다.

줄 삭제

먼저 샘플 파일의 내용을 확인합니다.

cat /home/labex/project/data.csv

파일 맨 위에 #으로 시작하는 주석 줄이 두 개 있는 것을 확인할 수 있습니다. 이 줄들을 제거합니다.

sed에서 줄을 삭제하려면 d 명령을 사용합니다.

  • 1d는 1 번 줄을 삭제합니다.
  • 1,2d는 1 번 줄부터 2 번 줄까지 삭제합니다.

줄 번호로 대상을 지정하는 방식은 sed의 기본 개념 중 하나입니다. 주소는 명령을 적용할 줄 또는 줄 범위를 sed에 알려 주고, 편집 명령은 해당 줄에 수행할 작업을 지정합니다.

다음 명령을 실행해 파일을 수정하지 않고 삭제 결과를 미리 확인합니다.

sed '1,2d' data.csv

출력에는 처음 두 줄이 제거된 파일 내용이 표시됩니다. 그러나 파일을 다시 확인해 보세요.

cat data.csv

두 줄이 여전히 남아 있습니다. 기본적으로 sed는 결과를 화면의 표준 출력으로 보내며 원본 파일은 수정하지 않습니다. 이는 안전을 위한 동작입니다.

파일에 변경 사항을 적용해 제자리에서 편집하려면 -i 옵션을 사용합니다.

sed -i '1,2d' data.csv

변경 결과를 확인합니다.

cat data.csv

이제 헤더 줄이 파일에서 영구적으로 제거되었습니다.

빈 줄 제거

파일에는 데이터 구조를 끊는 빈 줄이 아직 남아 있습니다. 처리할 데이터 파일에는 일반적으로 이러한 빈 줄이 필요하지 않습니다.

빈 줄을 제거하려면 삭제 명령 (d) 과 정규 표현식 (Regex) 을 함께 사용합니다.

  • ^는 줄의 시작을 의미합니다.
  • $는 줄의 끝을 의미합니다.
  • ^$는 시작하자마자 끝나는 줄, 즉 빈 줄과 일치합니다.

이 작업은 sed가 주소 패턴과 편집 동작을 결합하는 좋은 예입니다. /^$/ 패턴은 일치하는 줄을 선택하고, d는 선택된 줄을 삭제합니다.

/^$/d 명령은 sed에 "빈 줄 패턴과 일치하는 모든 줄을 삭제하라"고 지시합니다.

다음 명령을 실행해 빈 줄을 파일에서 직접 제거합니다.

sed -i '/^$/d' data.csv

결과를 확인합니다.

cat data.csv

이제 파일에 빈 공간 없이 데이터가 조밀하게 나열되어야 합니다.

텍스트 삽입

이제 불필요한 주석이 사라졌으므로 파일에 적절한 분류 헤더를 추가해 보겠습니다.

i(Insert) 명령은 지정한 줄 앞에 텍스트를 추가합니다.

  • 1i Text는 1 번 줄 앞에 "Text"를 삽입합니다.

a(Append) 명령은 지정한 줄 뒤에 텍스트를 추가합니다.

  • 1a Text는 1 번 줄 뒤에 "Text"를 삽입합니다.

삭제 및 치환과 함께 i, a 같은 명령을 사용하면 sed가 단순히 텍스트를 바꾸는 도구가 아니라는 것을 알 수 있습니다. sed는 데이터가 스트림을 통과하는 동안 줄을 제거하고, 추가하고, 선택해 스트림의 구조를 바꿀 수 있습니다.

다음 명령을 실행해 파일 맨 앞에 "Company Confidential"을 삽입합니다.

sed -i '1i Company Confidential' data.csv

파일 내용을 확인합니다.

cat data.csv

새 줄이 파일의 시작 부분에 삽입되고, 나머지 모든 줄은 한 줄씩 아래로 이동합니다.

특정 줄 출력

파일을 편집하지 않고 특정 줄만 추출해야 하는 경우도 있습니다. sed는 head나 tail을 더 유연하게 사용하는 것처럼 동작할 수 있습니다.

기본적으로 sed는 처리하는 모든 줄을 출력합니다. 특정 줄만 출력하려면 다음 두 가지를 사용합니다.

  1. 자동 출력을 억제하는 -n 옵션을 사용합니다.
  2. p 명령으로 특정 줄을 명시적으로 출력합니다.

-n을 사용하지 않으면 sed가 모든 줄을 자동으로 출력한 다음, p가 실행될 때 선택한 줄을 다시 출력합니다. 이로 인해 초보자는 결과를 혼동할 수 있습니다. -n은 기본 동작을 끄므로 명령에서 지정한 내용만 출력됩니다.

5 번 줄부터 10 번 줄까지 출력하려면 다음 명령을 실행합니다.

sed -n '5,10p' data.csv

마지막 줄만 출력하려면 $ 기호로 파일의 끝을 나타냅니다.

sed -n '$p' data.csv

이 방법은 로그 파일이 크고 그중 특정 구간만 확인하면 될 때 매우 유용합니다.

요약

이 실습에서는 sed를 사용한 스트림 편집의 기본 내용을 배웠습니다.

  1. 삭제 (d): 특정 줄 (1,2d) 또는 패턴과 일치하는 줄 (/^$/d) 을 제거합니다.
  2. 삽입 (i): 특정 위치에 텍스트를 파일 스트림에 추가합니다.
  3. 출력 (-n ... p): 기본 출력을 억제하고 선택한 줄만 출력합니다.
  4. 제자리 편집 (-i): 결과를 화면에 출력하는 대신 파일을 직접 수정합니다.

sed는 자동화된 텍스트 처리에 필수적인 도구이며, 셸 스크립트에서 구성 관리와 로그 분석을 위해 널리 사용됩니다.