재귀 sed 검색을 테스트하고 실행하기 전에 교체


13

시험 재귀 검색을 실행하고 sed실제로 실행하기 전에를 사용하여 바꾸는 방법 이 있습니까? 실제로 검색하고 바꾸기 전에 결과를 인쇄하고 싶습니다. 결과를 에코하는 것과 같은 것

grep -rl term1 . |xargs sed -i -e 's/term1/term2/'

데이터를 복사하고 명령을 실행 한 후 결과를 검사하십시오.
Kusalananda

답변:


10

당신은 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


흥미롭게도, 나는 -i의 의미를 찾으려고 시도했지만 man sed 아래에 나열되지 않았습니다. 귀하의 솔루션이 효과가있었습니다. 전체 파일이 아닌 행을 나열하는 가장 좋은 방법은 무엇입니까? 적은 배관으로 배관하는 대신 | grep term2, 일종의 효과가 있었지만 이상한 문자가있는 출력이있었습니다.
user251482

@ user251482- "이전 파일과 새 파일 사이의 차이점보기"에서와 같이 "줄만 나열"하시겠습니까?
grebneke

1
@StephaneChazelas 예, 또는 grep -rl --nullOP가 OS를 지정하지 않았기 때문에 더 좋으며 -ZBSD / OSX (압축 해제)에서 다른 것을 의미합니다. --nullGNU와 BSD 모두 동일합니다
grebneke

1
@grebneke. 좋은 지적이지만 OP가 GNU sed 구문을 사용하고 있으므로 BSD에 없다고 가정 할 수 있습니다. 주 grep(포크)로 FreeBSD와 NetBSD의에 GNU의 GREP이다. NetBSD에서 (man page에 따르면) -Z여전히 의미 --null는 있지만 --null이 더 이식 가능하다는 데 동의합니다. 또한 --null도 -Z도 OpenBSD에서 작동하지 않습니다
Stéphane Chazelas

1
@grebneke, 그것은 sed -i '' -e s/.../BSD에 있습니다 sed(선택적인 옵션은 없습니다)
Stéphane Chazelas

5

사용 sed으로 find대신grep

우선, 나는, find대신에 고용 grep하고 세 가지 이유가 있습니다.

  1. find보다 정확한 파일 선택이 가능합니다. 예를 들어, grep -r string *.txt현재 디렉토리에서만 파일을 생성합니다. 하위 디렉토리에있는 것은 아닙니다.
  2. find-exec전체 --null … |xargs 0구성에 대한 필요성을 제거 하는 강력한 옵션이 제공됩니다 .
  3. -readable-writable의 옵션 find에 액세스 할 수 없습니다 파일에 시간을 낭비하는 것을 방지 할 수 있습니다.

캡처 테스트

즉, grep무엇이 포착 될지보기 위해 첫 번째 테스트에 적합합니다.

$ find . -exec grep term1 {} \;

또는 더 구체적으로 :

$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;

드라 이런

이제 드라 이런을 진행하십시오 sed. sed옵션은 -n동의어입니다 --quietp의 맨 끝에서 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' {} \;

더 많은 find

더 많은 find예제는 여기 에서 찾을 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.