시험 재귀 검색을 실행하고 sed
실제로 실행하기 전에를 사용하여 바꾸는 방법 이 있습니까? 실제로 검색하고 바꾸기 전에 결과를 인쇄하고 싶습니다. 결과를 에코하는 것과 같은 것
grep -rl term1 . |xargs sed -i -e 's/term1/term2/'
답변
당신은 sed
없이 -i
출력을 통해 실행 할 수 있습니다less
grep -rl --null term1 . | xargs -0 sed -e 's/term1/term2/' | less
그런 다음 실행 sed
하여 -i.bak
나중에 차이가 나는 백업을 만듭니다.
grep -rl --null term1 . | xargs -0 sed -i.bak -e 's/term1/term2/'
diff somefile.bak somefile
# verify changes were correct
편집 : 의견에서 제안한대로을 사용하십시오 grep --null | xargs -0
. 이로 인해 파일 이름이 널 바이트로 종료되어 줄 바꿈과 같은 특수 문자가있는 파일 이름을 안전하게 사용할 수 있습니다. 예, \n
유닉스 파일 이름에 유효한 문자입니다. 금지 된 문자는 슬래시 /
와 널 문자입니다.\0
답변
사용 sed
으로 find
대신grep
우선, 나는, find
대신에 고용 grep
하고 세 가지 이유가 있습니다.
find
보다 정확한 파일 선택이 가능합니다. 예를 들어,grep -r string *.txt
현재 디렉토리에서만 파일을 생성합니다. 하위 디렉토리에있는 것은 아닙니다.find
-exec
전체--null … |xargs 0
구성에 대한 필요성을 제거 하는 강력한 옵션이 제공됩니다 .-readable
와-writable
의 옵션find
에 액세스 할 수 없습니다 파일에 시간을 낭비하는 것을 방지 할 수 있습니다.
캡처 테스트
즉, grep
무엇이 포착 될지보기 위해 첫 번째 테스트에 적합합니다.
$ find . -exec grep term1 {} \;
또는 더 구체적으로 :
$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;
드라 이런
이제 드라 이런을 진행하십시오 sed
. sed
옵션은 -n
동의어입니다 --quiet
과 p
의 맨 끝에서 sed
표현은 현재의 패턴 공간을 인쇄합니다.
$ find . -exec sed -n 's/term1/term2/gp' {} \;
또는 더 구체적으로 :
$ find . -type f -name '*.txt' -readable -writable -exec sed -n 's/term1/term2/gp' {} \;
실행
모든 것이 잘 보이는 경우, 대체하여 최종 명령을 실행 sed
옵션 -n
에 의해 -i
“장소”에 대한과를 제거하여 p
말.
$ find . -exec sed -i 's/term1/term2/g' {} \;
또는 더 구체적으로 :
$ find . -type f -name '*.txt' -readable -writable -exec sed -i 's/term1/term2/g' {} \;