.png)
내 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
우선, 게시물의 예에 비표준 인용 문자가 포함되어 있으므로 쉘 스크립트에서 "
및 '
(각각 ascii 코드 0x22
및 )와 같은 일반 ASCII 인용 부호를 사용하고 있는지 확인하십시오. 0x27
자세히 보면 좀 달라보이네요. 아마도 이는 Word, OOWriter 또는 브라우저 창과 같은 서식 있는 텍스트 문서 형식의 복사-붙여넣기 오류일 것입니다.
Mac을 사용하고 계시다면 아마도 FreeBSD 구현이 있을 것입니다 sed
. 이 경우 다음과 같이 명령을 작성해야 합니다:
find . -name "*.java" -exec sed -i '' "s/foo/bar/g" {} +
(여기서는 파일당 하나의 호출을 실행하는 것을 피하기 위해 +
대신 사용합니다 ).\;
sed
공백이 있거나 공백이 있는 경우 주변의 따옴표가 "s/foo/bar/g"
필요합니다 .foo
bar
FreeBSD 구현에서는 플래그의 sed
인수 -i
가 필요합니다: 백업 파일의 확장자. 예를 들어 이 명령을 사용하면 원본 파일에서 교체를 수행하기 전에 처음 으로 -i .bak
백업합니다 . 빈 인수를 사용한다는 것은 백업 파일을 사용하지 않는다는 의미인데, 이는 원하는 대로 보입니다.file1.txt
file1.txt.bak
''
GNU(또는 NetBSD, OpenBSD, busybox) 구현에서도 동일한 내용은 다음과 같습니다.
find . -name "*.java" -exec sed -i "s/foo/bar/g" {} +