콘텐츠로 이동

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