Programing

grep 및 교체 방법

lottogame 2020. 4. 24. 08:03
반응형

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


일반적으로 grep이 아니라 sed -i 's/string_to_find/another_string/g'or로 사용 perl -i.bak -pe 's/string_to_find/another_string/g'합니다.


다른 솔루션은 정규식 구문을 혼합합니다. 검색과 바꾸기 모두에 perl / PCRE 패턴을 사용 하고 모든 파일을 처리하지 않으 려면 다음 과 같이하십시오.

grep -rlZP 'match1' | xargs -0r perl -pi -e 's/match2/replace/g;'

여기서 match1과은 match2일반적으로 동일하지만 match1, 예를 들어 캡처 그룹 대체에만 관련된 고급 기능을 제거하기 위해 단순화 할 수있다.

번역 : 재귀 적으로 grep하고 파일 이름의 특수 문자를 보호하기 위해이 PCRE 패턴과 일치하는 nul로 구분 된 일치하는 파일을 나열 한 다음 null로 구분 된 목록이 필요한 xargs로 해당 파일 이름을 파이프하지만 그렇지 않은 경우 아무것도하지 않습니다 이름이 수신되면 perl이 각 파일을 다시 쓰고 일치하는 행을 대체합니다.

바이너리 파일도 무시 하는 I옵션을 추가하십시오 grep.


사용할 때 매우 조심 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의 크레딧


또 다른 옵션은 globstar와 함께 perl을 사용하는 것입니다.

사용 shopt -s globstar당신에 .bashrc(어디든지)가 허용 **글로브 패턴이 반복적으로 모든 하위 디렉토리와 파일을 일치.

따라서를 perl -pXe 's/SEARCH/REPLACE/g' -i **재귀 적으로로 대체 SEARCH합니다 REPLACE.

-X플래그는 perl에게 "모든 경고를 비활성화"하도록 지시합니다. 즉, 디렉토리에 대해 불평하지 않습니다.

또한 globstar를 사용하면 확장자 있는 모든 하위 파일에서 sed -i 's/SEARCH/REPLACE/g' **/*.ext바꾸려는 경우 와 같은 작업을 수행 할 수 있습니다 .SEARCHREPLACE.ext


여기 내가 할 일이 있습니다 :

find /path/to/dir -type f -iname "*filename*" -print0 | xargs -0 sed -i '/searchstring/s/old/new/g'

이 포함 된 모든 파일을 찾을 것입니다 filename세 이하 파일의 이름 /path/to/dir이있는 행을 검색, 발견 된 모든 파일에 대한보다 searchstring및 교체 old와 함께 new.

참고 URL : https://stackoverflow.com/questions/15402770/how-to-grep-and-replace

반응형