콘텐츠로 이동

sed 검색 및 변경

sed는 "stream editor"를 나타내는 명령입니다.

규칙

  • path: 실제 경로입니다. 예: /var/www/html/
  • filename: 실제 파일 이름입니다. 예: index.php

sed 사용

검색 및 대체를 위해sed를 사용하는 것은 개인적인 선호도입니다. 왜냐하면 웹 링크와 같이 "/"를 포함한 항목을 대체할 때 원하는 구분자를 사용할 수 있기 때문입니다. sed를 사용한 인라인 편집의 기본 예시는 다음과 같습니다:

sed -i 's/search_for/replace_with/g' /path/filename

그러나 "/"가 포함된 문자열을 검색해야하는 경우 어떻게 해야 할까요? 만약 슬래시(/)가 구분자로 유일한 옵션이라면 검색에 사용하기 전에 각각의 슬래시를 이스케이프해야 합니다. 여기서 sed가 다른 도구보다 우수한 이유입니다. 왜냐하면 구분자를 변경할 수 있기 때문에 구분자를 어디에서나 지정할 필요가 없습니다. 앞서 언급한 것처럼 "/"를 포함한 항목을 찾으려면 구분자를 "|"로 변경하면 됩니다. 다음은 이 방법을 사용하여 링크를 찾는 예시입니다:

sed -i 's|search_for/with_slash|replace_string|g' /path/filename

구분자로는 백슬래시, 개행 문자, "s"를 제외한 임의의 한 바이트 문자를 사용할 수 있습니다. 예를 들어 다음과 같이도 작동합니다:

sed -i 'sasearch_forawith_slashareplace_stringag' /path/filename 기서 "a"는 구분자이며, 검색과 대체는 여전히 작동합니다. 안전을 위해 검색 및 대체 시 백업을 지정할 수 있으며, 이는 sed를 사용하여 수행하는 변경 사항이 실제로 원하는 대로인지 확인하는 데 유용합니다. 이렇게 하면 백업 파일에서 복원 옵션이 제공됩니다: sed -i.bak s|search_for|replacea_with|g /path/filename

sed -i.bak s|search_for|replacea_with|g /path/filename

이 명령은 filenamefilename.bak으로 백업된 편집되지 않은 버전을 생성합니다.

따옴표 대신 큰 따옴표를 사용할 수도 있습니다:

sed -i "s|search_for/with_slash|replace_string|g" /path/filename

옵션 설명

옵션 설명
i 파일을 직접 편집합니다.
i.ext 확장자가 무엇이든 백업을 생성합니다(ext here).
s 검색을 지정합니다.
g 전역적으로 또는 모든 발생을 대체합니다.

여러 파일

안타깝게도 sed에는 perl과 같은 인라인 루핑 옵션이 없습니다. 여러 파일을 반복하려면 스크립트 내에서 sed 명령을 결합해야 합니다. 다음은 그 예시입니다.

먼저, 스크립트에서 사용할 파일 목록을 생성합니다. 다음과 같이 명령 줄에서 수행합니다:

find /var/www/html -name "*.php" > phpfiles.txt

다음으로 이 phpfiles.txt를 사용할 스크립트를 생성합니다:

#!/bin/bash

for file in `cat phpfiles.txt`
do
        sed -i.bak 's|search_for/with_slash|replace_string|g' $file
done
이 스크립트는 phpfiles.txt에서 생성된 모든 파일을 반복하고 각 파일의 백업을 만들며 검색 및 대체 문자열을 전역적으로 실행합니다. 변경 사항이 원하는 대로 확인되면 모든 백업 파일을 삭제할 수 있습니다.

기타 참고 자료와 예시

결론

sed는 구분자가 유연해야 하는 검색 및 대체 기능에 특히 잘 작동하는 강력한 도구입니다.

Author: Steven Spencer