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
바꾸려는 경우 와 같은 작업을 수행 할 수 있습니다 .SEARCH
REPLACE
.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
'Programing' 카테고리의 다른 글
활동 상황과 응용 상황의 차이 (0) | 2020.04.24 |
---|---|
Base64로 문자열을 인코딩하려면 왜 'b'가 필요합니까? (0) | 2020.04.24 |
2 시간마다 cron 작업을 실행하는 방법 (0) | 2020.04.24 |
C #에서 개인 속성을 사용해야하는 이유가 있습니까? (0) | 2020.04.24 |
Favicon : .ico 또는 .png / 올바른 태그? (0) | 2020.04.24 |