디렉토리의 모든 파일과 하위 디렉토리에서 지정된 문자열을 재귀 적으로 검색하고이 문자열을 다른 문자열로 바꿔야합니다.
나는 그것을 찾는 명령이 다음과 같다는 것을 알고 있습니다.
grep 'string_to_find' -r ./*
그러나 모든 인스턴스 string_to_find
를 다른 문자열로 어떻게 바꿀 수 있습니까?
답변
또 다른 옵션은 find를 사용한 다음 sed를 통해 전달하는 것입니다.
find /path/to/files -type f -exec sed -i 's/oldstring/new string/g' {} \;
답변
나는 대답을 얻었다.
grep -rl matchstring somedir/ | xargs sed -i 's/string1/string2/g'
답변
다음과 같이 할 수도 있습니다.
예
grep -rl 'windows' ./ | xargs sed -i 's/windows/linux/g'
현재 디렉토리와 관련된 모든 파일에서 문자열 ‘ windows ‘를 검색하고 각 파일에서 문자열이 나타날 때마다 ‘ windows ‘를 ‘ linux ‘로 바꿉니다 .
답변
이것은 OS X에서 가장 효과적입니다.
grep -r -l 'searchtext' . | sort | uniq | xargs perl -e "s/matchtext/replacetext/" -pi
출처 : http://www.praj.com.au/post/23691181208/grep-replace-text-string-in-files
답변
다른 솔루션은 정규식 구문을 혼합합니다. 검색과 바꾸기 모두에 perl / PCRE 패턴을 사용 하고 일치하는 파일 만 처리하려면 다음과 같이 작동합니다.
grep -rlZPi 'match1' | xargs -0r perl -pi -e 's/match2/replace/gi;'
여기서 match1
과은 match2
일반적으로 동일하지만 match1
, 예를 들어 캡처 그룹 대체에만 관련된 고급 기능을 제거하기 위해 단순화 할 수있다.
번역 : grep
이 PCRE 패턴과 일치하는 파일을 재귀 적으로 나열하고 파일 이름의 특수 문자를 보호하기 위해 nul로 구분 한 다음 파일 이름이 널 xargs
분리 목록이 필요한 파일 이름을 파이프 하지만 이름이 수신되지 않으면 아무 것도 수행하지 않습니다. 얻을 perl
일치가 발견 라인을 대체 할 수 있습니다.
이진 파일을 무시 하려면 I
스위치를 추가하십시오 grep
. 대소 문자 매칭 드롭 i
전환 grep
및 i
대체 식 부착 플래그하지만 하지i
에 스위치 perl
자체.
답변
일반적으로 grep이 아니라 sed -i 's/string_to_find/another_string/g'
또는을 사용 perl -i.bak -pe 's/string_to_find/another_string/g'
합니다.
답변
사용할 때 매우 조심 find
하고 sed
힘내의 repo에! 이진 파일을 제외하지 않으면이 오류가 발생할 수 있습니다.
error: bad index file sha1 signature
fatal: index file corrupt
이 오류를 해결하려면을 (으) sed
로 교체하여 를 되돌려 야 new_string
합니다 old_string
. 교체 된 문자열을 되돌 리므로 문제의 시작 부분으로 돌아갑니다.
문자열을 검색하고 바꾸는 올바른 방법 은 이진 파일을 무시하기 위해 건너 뛰고 대신 find
사용하는 grep
것입니다.
sed -ri -e "s/old_string/new_string/g" $(grep -Elr --binary-files=without-match "old_string" "/files_dir")
@hobs의 크레딧