기계적 인조 인간

sed를 사용하여 파일에서 문자열을 찾아 바꾸는 방법

Sa Vào Nguy Hiểm | 悬溺 — 葛东琪 | Ya i ya i ya i ya i ya i ya | Bài Hát Hot Nhất Tik Tok Trung Quốc

Sa Vào Nguy Hiểm | 悬溺 — 葛东琪 | Ya i ya i ya i ya i ya i ya | Bài Hát Hot Nhất Tik Tok Trung Quốc

차례:

Anonim

텍스트 파일을 다룰 때 종종 하나 이상의 파일에서 텍스트 문자열을 찾아서 바꿔야합니다.

sed s treamed sed 입니다. 파일 및 파이프 라인과 같은 입력 스트림에서 기본 텍스트 조작을 수행 할 수 있습니다. sed 를 사용하면 단어와 줄을 검색, 찾기 및 바꾸기, 삽입 및 삭제할 수 있습니다. 복잡한 패턴을 일치시킬 수있는 기본 및 확장 정규식을 지원합니다.

문자열을 찾아서 sed 바꾸는 방법에 대해 이야기하겠습니다. 또한 재귀 검색 및 바꾸기를 수행하는 방법을 보여줍니다.

sed 문자열 찾기 및 바꾸기

sed 에는 몇 가지 버전이 있으며 기능상 차이가 있습니다. macOS는 BSD 버전을 사용하며 대부분의 Linux 배포판에는 기본적으로 GNU sed 사전 설치되어 있습니다. 우리는 GNU 버전을 사용할 것입니다.

sed 사용하여 텍스트를 검색하고 바꾸는 일반적인 형식은 다음과 같습니다.

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i 기본적으로 sed 는 출력을 표준 출력에 기록합니다. 이 옵션은 sed 가 파일을 편집하도록 지시합니다. 확장자가 제공되면 (예: -i.bak) 원본 파일의 백업이 생성됩니다. s 대체 명령, 아마도 sed에서 가장 많이 사용 된 명령입니다. / / / -구분 문자. 임의의 문자가 될 수 있지만 일반적으로 슬래시 ( / ) 문자가 사용됩니다. SEARCH_REGEX 검색 할 일반 문자열 또는 정규식입니다. REPLACEMENT 교체 문자열입니다. g 글로벌 대체 플래그. 기본적으로 sed 는 파일을 한 줄씩 읽고 한 줄에서 SEARCH_REGEX 의 첫 항목 만 변경합니다. 교체 플래그가 제공되면 모든 발생이 교체됩니다. INPUTFILE 명령을 실행하려는 파일의 이름입니다.

쉘 메타 문자가 확장되지 않도록 인수를 따옴표로 묶는 것이 좋습니다.

sed 명령을 사용하여 파일에서 텍스트를 검색하고 가장 일반적으로 사용되는 옵션 및 플래그로 바꾸는 방법에 대한 예를 살펴 보겠습니다.

데모 목적으로 다음 파일을 사용합니다.

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

전역 대체 플래그를 사용하면 sed 는 모든 검색 패턴을 대체합니다.

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

알다시피, 이전 예제에서 foobar 문자열 내부의 하위 문자열 foo 도 바뀝니다. 이것이 원하는 동작이 아닌 경우 검색 문자열의 양쪽 끝에 단어 경계 표현식 ( \b )을 사용하십시오. 이렇게하면 부분 단어가 일치하지 않습니다.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

패턴 대소 문자를 구분하지 않으려면 I 플래그를 사용하십시오. 아래 예제에서 g I 플래그를 모두 사용하고 있습니다.

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

더 쉽고 훨씬 읽기 쉬운 옵션은 다른 구분 문자를 사용하는 것입니다. 대부분의 사람들은 세로 막대 ( | ) 또는 콜론 (:)을 사용하지만 다른 문자를 사용할 수 있습니다.

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

정규식을 사용할 수도 있습니다. 예를 들어 3 자리 숫자를 모두 검색하고 사용하는 문자열 number 바꾸려면 다음을 수행하십시오.

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

sed의 또 다른 유용한 기능은 앰퍼샌드 문자 & 를 사용하여 일치하는 패턴에 해당한다는 것입니다. 캐릭터는 여러 번 사용할 수 있습니다.

예를 들어, 각 3 자리 숫자 주위에 중괄호 {} 를 추가하려면 다음을 입력하십시오.

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

마지막으로, sed 로 파일을 편집 할 때 항상 백업하는 것이 좋습니다. 이를 위해서는 -i 옵션의 확장자 만 제공하십시오. 예를 들어, file.txt 를 편집하고 원본 파일을 file.txt.bak 로 저장하려면 다음을 사용하십시오.

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

재귀 찾기 및 바꾸기

때로는 문자열이 포함 된 파일을 찾기 위해 디렉토리를 재귀 적으로 검색하고 모든 파일에서 문자열을 바꾸려고합니다. 디렉토리에서 파일을 재귀 적으로 find 또는 grep 과 같은 명령을 사용하고 파일 이름을 sed 파이핑하여이를 수행 할 수 있습니다.

다음 명령은 현재 작업 디렉토리에서 파일을 재귀 적으로 검색하고 파일 이름을 sed 전달합니다.

find. -type f -exec sed -i 's/foo/bar/g' {} +

파일 이름에 공백이 포함 된 파일의 문제를 피하려면 -print0 옵션을 사용하십시오. find 는 파일 이름을 인쇄 한 다음 널 문자를 출력하고 xargs -0 사용하여 출력을 sed 파이프합니다.

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

디렉토리를 제외하려면 -not -path 옵션을 사용하십시오. 예를 들어, 로컬 git repo에서 문자열을 바꾸어 점 ( . )으로 시작하는 모든 파일을 제외하려면 다음을 사용하십시오.

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

다른 옵션은 grep 명령을 사용하여 검색 패턴을 포함하는 모든 파일을 재귀 적으로 찾은 다음 파일 이름을 sed 로 파이프하는 것입니다.

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

결론

복잡하고 복잡해 보일 수 있지만 처음에는 파일에서 텍스트를 sed 로 검색하고 바꾸는 것이 매우 간단합니다.

sed 명령, 옵션 및 플래그에 대한 자세한 내용은 GNU sed 매뉴얼 및 Grymoire sed 튜토리얼을 참조하십시오. 질문이나 의견이 있으시면 언제든지 의견을 남겨주십시오.

sed 터미널