[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)를 포함하여 여러 번의 교체와 함께 작동합니다.
답변
여러 파일에서 문자열을 바꾸려면 다음을 사용할 수 있습니다.
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'
@ 기호는 모든 특수 문자가 다음 문자열에서 무시되어야 함을 의미합니다.