찾기 및 sed (검색 및 바꾸기)


26

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 .

2
정확히 당신이 실행중인 것입니까? -exec그 후 모든 것을 제거하면 어떻게 되나요? Java 파일의 이름을 인쇄합니까? (ASCII 따옴표 대신 스마트 따옴표를 사용하는 것이 걱정됩니다.)
Mikel

1
사실, 그것은 적어도 나를 위해 그것을 해결합니다. 큰 따옴표와 작은 따옴표는 각각 "및 로 대체해야합니다 '.
Lev Levitsky

2
똑똑한 (?) 따옴표! .. :)
Peter.O

내가 붙여 넣은 것은 내가 실행중인 것이 었습니다. 누군가 답변을 게시 할 수 있습니까?
Amir Afghani

1
다음에 질문 할 때 표시되는 오류 메시지를 게시하십시오. 모든 사람의 시간을 절약 할 수 있습니다.
Mikel

답변:


34

우선, 글의 예제에는 비표준 따옴표 문자가 포함되어 있기 때문에 쉘 스크립트에서 "and '(ascii 코드 0x220x27) 와 같은 일반 ASCII 따옴표를 사용하고 있는지 확인하십시오 . 자세히 보면 조금 다르게 보입니다. 아마도 이것은 Word, OOWriter 또는 브라우저 창과 같은 서식있는 텍스트 문서 형식의 복사-붙여 넣기 오류 일 것입니다.

Mac을 사용하고 있기 때문에 대부분 FreeBSD 구현이있을 것입니다.이 sed경우 명령을 다음과 같이 작성해야합니다.

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

(여기서 파일 당 하나의 호출을 실행하지 않기 위해 +대신 사용 ).\;sed

FreeBSD sed에서 -i플래그를 구현 하려면 백업 파일의 확장자 인 인수가 필요합니다. 로 예를 들어 -i .bak것 백업 명령 file1.txt으로 file1.txt.bak원본 파일의 교체를 수행하기 전에 먼저. 빈 인수 ''를 사용한다는 것은 원하는 백업 파일을 사용하지 않는 것을 의미합니다.

GNU (또는 NetBSD, OpenBSD, busybox) 구현에서 동일한 내용은 다음과 같습니다.

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

귀하의 의견으로 답변을 개선해 주신 @bahamat@Mikel@ pieter-breed 에게 감사드립니다 .


중괄호는 무엇을합니까?
Zane Hitchcox

3
@ZaneHitchcox 중괄호은 자리가 일치하는 파일 이름입니다
정지 지속적인 피해 모니카에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.