Mac에서 다음 명령을 사용하고 있습니다.

$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \; 

효과가없는 것 같습니다.

디렉토리에 .java로 끝나는 파일이 두 개 있습니다. 둘 다 foo 텍스트가 없습니다. 누락 된 것이 있습니까?

편집 : 댓글 요청 결과

[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i "s/foo/bar/g" {} \; sed: 1: "./bar.java": invalid command code . sed: 1: "./foo.java": invalid command code . 

댓글

  • 정확히 ' 실행 중입니까? -exec 및 그 이후의 모든 항목을 제거하면 어떻게됩니까? Java 파일의 이름이 인쇄됩니까? (' 걱정됩니다. ' ASCII 따옴표 대신 스마트 따옴표를 사용하고 있습니다.)
  • 실제로 적어도 저에게는 문제가 해결됩니다. 큰 따옴표와 작은 따옴표 모두 대체해야합니다. 작성자 : "'.
  • Sm art (?) 따옴표! .. 🙂
  • 붙여 넣은 것은 정확히 제가 실행하고있는 것입니다. 누군가 답변을 게시 할 수 있습니까?
  • 다음 번에 질문 할 때 표시되는 오류 메시지를 게시하십시오. 모든 사람의 시간을 절약 할 수 있습니다.

답변

먼저 일반 ASCII를 사용하고 있는지 확인하십시오. "" (ASCII 코드 0x22 및 , 각각) 셸 스크립트에서 사용합니다. 게시물의 예에 비표준 따옴표가 포함되어 있기 때문입니다. 자세히 살펴보면 약간 다르게 보입니다. 대부분은 서식있는 텍스트 문서의 복사-붙여 넣기 오류 일 수 있습니다. Word, OOWriter 또는 브라우저 창과 같은 형식입니다.

Mac에서는 FreeBSD의 sed 구현이있을 것입니다. 다음과 같이 명령을 작성해야하는 경우 :

find . -name "*.java" -exec sed -i "" s/foo/bar/g {} + 

(여기서는 iv id = 대신 + 사용 “00a3d0c9c2″>

파일 당 하나의 sed 호출 실행을 방지합니다).

sed 플래그에는 백업 파일의 확장자 인 인수가 필요합니다. 예를 들어 -i .bak의 경우이 명령은 다음 위치에서 교체를 수행하기 전에 먼저 file1.txtfile1.txt.bak로 백업합니다. 원본 파일. 빈 인수 ""를 사용하는 것은 백업 파일을 사용하지 않음을 의미하며, 원하는대로 보입니다.

GNU (또는 NetBSD, OpenBSD)에서도 마찬가지입니다. , busybox) 구현은 다음과 같습니다.

find . -name "*.java" -exec sed -i s/foo/bar/g {} + 

감사합니다. @bahamat @Mikel @ pieter-breed 귀하의 의견을 통해 제 답변을 개선했습니다.

주석

  • 중괄호는 무엇을합니까?
  • @ZaneHitchcox 중괄호는 일치하는 파일 이름에 대한 자리 표시 자입니다.
  • what ' +가 마지막에 수행합니까?
  • @Anthony the +-exec 옵션의 인수 목록을 종료합니다. -exec 구문에 필요합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다