find & sed (검색 및 바꾸기)

find & sed (검색 및 바꾸기)

내 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 .

답변1

먼저, 게시물의 예에 비표준 따옴표 문자가 포함되어 있으므로 쉘 스크립트에서 "'(각각 0x22) 과 같은 일반 ASCII 따옴표를 사용해야 합니다 . 0x27자세히 보면 조금 다르게 보입니다. 이는 Word, OOWriter 또는 브라우저 창과 같은 서식 있는 텍스트 문서 형식의 복사-붙여넣기 오류일 가능성이 높습니다.

Mac을 사용하고 있으므로 FreeBSD 구현이 있을 가능성이 높습니다 sed. 이 경우 다음과 같은 명령을 작성해야 합니다.

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

(여기에서는 파일당 하나의 호출을 실행하는 것을 피하기 +위해 대신 사용됩니다 ).\;sed

또는 안에 공백이 있으면 주위에 따옴표를 "s/foo/bar/g"붙여야 합니다.foobar

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그리고@미켈그리고@피터-품종귀하의 의견으로 내 답변을 개선하십시오.

관련 정보