소개
Linux 에서 텍스트 파일을 다룰 때는 대화형 텍스트 편집기를 열지 않고 자동으로 편집해야 하는 경우가 많습니다. 예를 들어 CSV 파일에서 헤더를 제거하거나, 빈 줄을 삭제하거나, 로그 파일에서 특정 줄 범위를 추출해야 할 수 있습니다.
이러한 작업에는 sed(스트림 편집기) 를 사용합니다.
sed는 강력한 비대화형 텍스트 편집기입니다. 파일이나 파이프에서 입력을 읽고, 각 줄에 작업을 수행한 다음 결과를 출력합니다. 이러한 "읽기, 변환, 출력" 모델은 전통적인 Unix 방식이며 파이프라인에서 특히 유용합니다.
이 모델에서 스트림 편집기라는 이름이 유래했습니다. sed는 전체 화면 편집기처럼 파일을 열어 작업하는 것이 아니라, 흘러가는 텍스트를 처리하도록 설계되었습니다. 따라서 셸 파이프라인과 자동화 스크립트에 자연스럽게 연결할 수 있습니다.
이 실습에서는 다음 방법을 배웁니다.
- 줄 삭제 (
d): 필요하지 않은 헤더나 주석을 제거합니다. - 빈 줄 제거: 정규 표현식을 사용해 빈 줄을 필터링합니다.
- 텍스트 삽입 (
i): 파일에 새 줄을 추가합니다. - 줄 출력 (
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는 처리하는 모든 줄을 출력합니다. 특정 줄만 출력하려면 다음 두 가지를 사용합니다.
- 자동 출력을 억제하는
-n옵션을 사용합니다. p명령으로 특정 줄을 명시적으로 출력합니다.
-n을 사용하지 않으면 sed가 모든 줄을 자동으로 출력한 다음, p가 실행될 때 선택한 줄을 다시 출력합니다. 이로 인해 초보자는 결과를 혼동할 수 있습니다. -n은 기본 동작을 끄므로 명령에서 지정한 내용만 출력됩니다.
5 번 줄부터 10 번 줄까지 출력하려면 다음 명령을 실행합니다.
sed -n '5,10p' data.csv
마지막 줄만 출력하려면 $ 기호로 파일의 끝을 나타냅니다.
sed -n '$p' data.csv
이 방법은 로그 파일이 크고 그중 특정 구간만 확인하면 될 때 매우 유용합니다.
요약
이 실습에서는 sed를 사용한 스트림 편집의 기본 내용을 배웠습니다.
- 삭제 (
d): 특정 줄 (1,2d) 또는 패턴과 일치하는 줄 (/^$/d) 을 제거합니다. - 삽입 (
i): 특정 위치에 텍스트를 파일 스트림에 추가합니다. - 출력 (
-n ... p): 기본 출력을 억제하고 선택한 줄만 출력합니다. - 제자리 편집 (
-i): 결과를 화면에 출력하는 대신 파일을 직접 수정합니다.
sed는 자동화된 텍스트 처리에 필수적인 도구이며, 셸 스크립트에서 구성 관리와 로그 분석을 위해 널리 사용됩니다.



