[linux] 리눅스 명령 줄에서 여러 파일의 문자열을 바꾸는 방법

폴더에있는 많은 파일의 문자열을 ssh서버에 대한 액세스 권한으로 만 바꿔야 합니다. 어떻게해야합니까?



답변

cd /path/to/your/folder
sed -i 's/foo/bar/g' *

“foo”가 발생하면 “bar”로 바뀝니다.

macOS와 같은 BSD 시스템 -i '.bak'에서는 맨 페이지마다 “위험 손상 또는 부분 내용” 과 같은 백업 확장명을 제공해야합니다 .

cd /path/to/your/folder
sed -i '.bak' 's/foo/bar/g' *


답변

Kaspar의 답변과 비슷하지만 g 플래그를 사용하여 모든 행을 대체합니다.

find ./ -type f -exec sed -i 's/string1/string2/g' {} \;

대소 문자를 구분하지 않는 경우 :

find ./ -type f -exec sed -i 's/string1/string2/gI' {} \;


답변

@kev의 대답은 좋지만 직접 디렉토리의 파일에만 영향을 미칩니다. 아래 예는 grep을 사용하여 파일을 재귀 적으로 찾습니다. 그것은 매번 나를 위해 작동합니다.

grep -rli 'old-word' * | xargs -i@ sed -i 's/old-word/new-word/g' @

명령 분석

grep -r : –recursive , 각 디렉토리의 모든 파일을 재귀 적으로 읽습니다.
grep -l : –print-with-matches 는 일치하는 줄을 인쇄하는 대신 일치하는 각 파일의 이름을 인쇄합니다.
grep -i : –ignore-case .

xargs : STDIN을 인수로 변환하십시오 . 이 답변을 따르십시오 .
xargs -i @ ~ command에는 @ ~ : ~ command ~ 의 특정 위치에서 사용될 인수의 자리 표시자가 포함되어 있으며 @ 기호는 모든 문자열로 대체 할 수있는 자리 표시 자입니다.

sed -i : 백업 없이 파일을 편집합니다 .
sed s / regexp / replacement / : regexp교체 문자열 일치 .
sed s / regexp / replacement / g : global , 첫 번째 일치 만이 아니라 각 일치를 대체하십시오.


답변

이것은 나를 위해 일했다 :

find ./ -type f -exec sed -i 's/string1/string2/' {} \;

그러나, 이것은하지 않았다 : sed -i 's/string1/string2/g' *. “foo”는 string2가 아니며 “bar”는 string2가 아닙니다.


답변

이에 대한 몇 가지 표준 답변이 이미 나열되어 있습니다. 일반적으로 find 를 사용 하여 파일을 재귀 적으로 나열한 다음 sed 또는 perl을 사용 하여 작업을 수행 할 수 있습니다 .

가장 빠른 사용을 위해 rpl 명령 을 기억하기가 훨씬 쉽다는 것을 알 수 있습니다. 다음은 모든 파일에서 재귀 적으로 대체 (foo-> bar)입니다.

rpl -R foo bar .

설치해야 할 수도 있습니다 ( apt-get install rpl또는 유사).

그러나 정규 표현식과 역 치환 또는 파일 이름 바꾸기 및 검색 및 교체와 관련된 힘든 작업의 ​​경우 내가 알고있는 가장 일반적이고 강력한 도구는 repren 이며, 일부는 작은 Python 스크립트였습니다. 가시적 인 이름 바꾸기 및 리팩토링 작업. 선호하는 이유는 다음과 같습니다.

  • 파일 이름 바꾸기 및 파일 내용 검색 및 교체를 지원합니다.
  • 검색 및 바꾸기를 수행하기 전에 변경 사항을 확인하십시오.
  • 역 치환, 전체 단어, 대소 문자 구분 및 대소 문자 보존 (foo-> bar, Foo-> Bar, FOO-> BAR) 모드로 정규식을 지원합니다.
  • 스왑 (foo-> bar and bar-> foo) 또는 고유하지 않은 대체 세트 (foo-> bar, f-> x)를 포함하여 여러 번의 교체와 함께 작동합니다.

사용하려면 pip install repren. README 에서 예제를 확인하십시오 .


답변

여러 파일에서 문자열을 바꾸려면 다음을 사용할 수 있습니다.

grep -rl string1 somedir/ | xargs sed -i 's/string1/string2/g'

예 :

grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'

소스 블로그


답변

이스케이프 문자를 제외하고 파일 내의 경로를 바꾸려면 다음 명령을 사용할 수 있습니다.

sed -i 's@old_path@new_path@g'

@ 기호는 모든 특수 문자가 다음 문자열에서 무시되어야 함을 의미합니다.