sed 치환 기초

LinuxBeginner
지금 연습하기

소개

텍스트 처리에서 흔히 수행하는 작업 중 하나는 "찾기 및 바꾸기"입니다. 워드 프로세서에서는 이 작업을 대화형으로 수행합니다. Linux 명령줄 환경에서는 sed를 사용하여 같은 작업을 스크립트로 자동화하고 비대화형으로 수행할 수 있습니다.

sed는 텍스트를 한 줄씩 처리하는 비대화형 텍스트 편집기입니다. 특히 특정 패턴을 새 텍스트로 바꾸는 치환 작업에 강력합니다. 편집기 앞에 사람이 앉아 같은 변경 작업을 반복하지 않아도 되므로 자동화에 유용합니다.

이 실습에서는 다음 내용을 배웁니다.

  1. 텍스트 치환 (s): 기본적인 찾기 및 바꾸기 작업을 수행합니다.
  2. 전역 치환 (g): 한 줄에서 패턴이 처음 나타난 부분만이 아니라 모든 부분을 바꿉니다.
  3. 사용자 지정 구분자 사용: 대체 구분자를 사용하여 파일 경로처럼 슬래시가 포함된 텍스트를 처리합니다.
  4. 백업을 사용한 직접 편집: 자동으로 백업 사본을 만들어 파일을 안전하게 수정합니다.

기본 치환

간단한 문자열 치환부터 시작합니다. "World"라는 단어를 "Linux"로 바꿉니다.

sed에서 치환에 사용하는 명령은 s입니다.

구문은 s/Pattern/Replacement/입니다.

이 명령 형식은 매우 일반적이어서 많은 사용자가 sed를 "검색 및 바꾸기 도구"라고 생각합니다. 하지만 sed는 실제로 스트림 편집기입니다. 치환은 sed에서 가장 자주 사용하는 편집 명령 중 하나일 뿐입니다.

다음 명령을 실행하여 동작을 확인합니다.

echo "Hello World" | sed 's/World/Linux/'

작동 방식:

  1. echo가 "Hello World"를 표준 출력으로 보냅니다.
  2. 파이프 |가 이 출력을 sed로 전달합니다.
  3. sed가 텍스트를 읽고 "World" 패턴을 찾아 "Linux"로 바꾼 다음 결과를 출력합니다.

참고: 이 명령은 원본을 영구적으로 수정하지 않습니다. 수정된 텍스트를 화면의 표준 출력 (Standard Output) 에 표시할 뿐입니다.

이 차이는 안전한 명령줄 편집의 핵심입니다. Unix 방식의 도구는 먼저 변환된 스트림을 보여 주고, 그 결과를 저장하거나 리디렉션할지는 나중에 사용자가 결정하는 경우가 많습니다.

전역 치환

기본적으로 sed는 각 줄에서 찾은 첫 번째 일치 항목만 바꿉니다.

텍스트가 "apple apple"이고 "apple"을 "orange"로 치환하면 sed는 "orange apple"을 출력합니다.

한 줄에 있는 모든 항목을 바꾸려면 치환 명령 끝에 전역 플래그(g) 를 사용해야 합니다.

여기서 중요한 점은 "각 줄에서"라는 부분입니다. sed는 한 번에 한 줄씩 처리하므로 g 플래그는 파일 전체를 하나의 거대한 텍스트 블록으로 처리하는 것이 아니라 현재 줄 안의 모든 일치 항목에 적용됩니다.

샘플 파일 quote.txt를 확인합니다.

cat quote.txt

출력: I love Coding. Coding is fun.

이제 전역 플래그 없이 "Coding"을 "Programming"으로 바꿔 봅니다.

sed 's/Coding/Programming/' quote.txt

결과: I love Programming. Coding is fun.

두 번째 "Coding"은 건너뛴 것을 확인할 수 있습니다.

이제 g 플래그를 추가합니다.

sed 's/Coding/Programming/g' quote.txt

결과: I love Programming. Programming is fun.

이제 두 항목이 모두 성공적으로 바뀌었습니다.

다른 구분자 사용

표준 sed 구문에서는 슬래시 (/) 를 구분자로 사용합니다. 예: s/old/new/.

하지만 바꾸려는 텍스트에 파일 경로 (/usr/local/bin 등) 처럼 슬래시가 포함되어 있으면 모든 슬래시 앞에 백슬래시를 사용해 이스케이프해야 합니다. 그러면 명령이 읽기 어려워집니다. 예: s/\/usr\/local\/bin/\/bin/.

다행히 sed에서는 거의 모든 문자를 구분자로 사용할 수 있습니다. 일반적인 대체 구분자로는 #, :, | 등이 있습니다.

읽기 쉬운 구분자를 선택하는 것은 단순한 문법 요령이 아니라 실용적인 기술입니다. 패턴에 / 문자가 많이 포함되어 있을 때 구분자를 바꾸면 명령을 더 쉽게 이해할 수 있고 오류도 줄일 수 있습니다.

경로가 들어 있는 파일을 만듭니다.

echo "/usr/local/bin" > path.txt

이제 #을 구분자로 사용하여 /usr/local/bin을 /bin으로 바꿉니다.

sed 's#/usr/local/bin#/bin#' path.txt

결과: /bin

#을 구분자로 사용했기 때문에 sed는 경로에 포함된 / 문자를 일반 텍스트로 처리합니다. 따라서 명령이 훨씬 깔끔하고 읽기 쉬워집니다.

백업을 사용한 직접 편집

지금까지 sed는 변경 결과를 화면에 출력하기만 했습니다. 파일을 직접 수정하는 "직접 편집 (in-place)"을 수행하려면 -i 옵션을 사용합니다.

하지만 파일을 직접 수정하는 작업에는 위험이 따릅니다. 패턴을 잘못 작성하면 데이터가 손실될 수 있습니다. 따라서 파일을 수정하기 전에 원본 파일의 백업을 만드는 것이 좋습니다.

-i.bak처럼 -i 옵션에 확장자를 지정하면 백업을 만들 수 있습니다.

quote.txt를 수정하고 quote.txt.bak이라는 백업 파일을 자동으로 만듭니다.

sed -i.bak 's/fun/awesome/' quote.txt

이제 수정된 파일의 내용을 확인합니다.

cat quote.txt

결과: I love Coding. Coding is awesome.

이어서 백업 파일이 존재하고 원본 텍스트를 포함하는지 확인합니다.

ls -l quote.txt.bak
cat quote.txt.bak

결과: I love Coding. Coding is fun.

여러 파일에 일괄 편집을 적용할 때 유용한 모범 사례입니다.

이러한 백업 습관이 중요한 이유는 비대화형 편집이 빠르지만 실수를 허용하지 않기 때문입니다. 여러 파일에 걸쳐 텍스트 치환을 자동화할 때 패턴의 작은 오류가 빠르게 확산될 수 있으므로 원본 사본을 보관하는 것은 간단하면서도 효과적인 안전장치입니다.

요약

이 실습에서는 sed를 사용한 텍스트 치환의 핵심을 배웠습니다.

  1. 치환 (s///): 텍스트를 찾고 바꾸는 표준 명령입니다.
  2. 전역 플래그 (g): 한 줄에서 패턴의 모든 항목을 바꿉니다.
  3. 사용자 지정 구분자: # 같은 문자를 사용하여 /가 포함된 경로와 URL 을 안전하게 처리합니다.
  4. 직접 편집 및 백업 (-i.bak): 원본 내용을 보존하면서 파일을 안전하게 수정합니다.

이러한 기술을 활용하면 복잡한 텍스트 처리 작업을 효율적이고 안전하게 자동화할 수 있습니다.