[linux] grep 및 교체 방법

디렉토리의 모든 파일과 하위 디렉토리에서 지정된 문자열을 재귀 적으로 검색하고이 문자열을 다른 문자열로 바꿔야합니다.

나는 그것을 찾는 명령이 다음과 같다는 것을 알고 있습니다.

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전환 grepi대체 식 부착 플래그하지만 하지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의 크레딧