sed -i 호출에 어떤 문제가 있나요?

sed -i 호출에 어떤 문제가 있나요?

이 줄이 있어요

find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 sed -i 's/AAA/BBB/g'

내 목적은 .plist, .mp4 및 .DS* 확장자를 가진 파일을 제외하고 현재 디렉터리의 모든 파일에서 모든 AAA 항목을 BBB로 반복적으로 변경하는 것입니다.

그런데 메시지를 받았어

sed: 1: "./myDir/pro ...": invalid command code .

답변1

가장 간단한 해결책은 다음을 사용하는 것입니다.

find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 perl -pi -w -e  's/AAA/BBB/g'

답변2

GNU sed와 달리 Mac OSX와 함께 제공되는 sed에는 -i백업 접미사를 지정하는 옵션 인수가 필요합니다. 백업을 억제하려면 빈 문자열( '')을 전달해야 합니다. 따라서 sed는 your을 s/AAA/BBB/백업 접미사로 해석하고 첫 번째 파일 이름( ./myDir/pro ...)을 실행할 명령으로 해석합니다. 물론 .이것은 유효한 sed 명령이 아니므로 오류가 발생합니다. 이를 염두에 두고 다음이 작동합니다.

find [...] | xargs -0 sed -i.bak 's/AAA/BBB/g'

또는 백업 억제를 고집하는 경우

find [...] | xargs -0 sed -i '' 's/AAA/BBB/g'

관련 정보