macOS Monterey에서 "-e"가 여러 개 포함된 "sed"에 오류가 발생하는 이유는 무엇입니까? [복사]

macOS Monterey에서 "-e"가 여러 개 포함된 "sed"에 오류가 발생하는 이유는 무엇입니까? [복사]

macOS Monterey에서 이런 일이 발생하는 이유는 다음과 같습니다.

$ sed -i -e 's/<azure\/core\/internal\//</g' -e 's/<azure\/core\//</g' -e 's/<azure\/iot\/internal\//</g' -e 's/<azure\/iot\//</g' .

...다음 오류가 발생합니다.

sed: -e: No such file or directory

답변1

설명에서 언급했듯이 sed의 BSD 버전은 -i필수 매개변수를 사용하므로 에서는 sed -i -e-e매개변수가 백업 파일의 파일 이름 접미사가 됩니다. 그런 다음 명령의 다음 인수는 s/<azure\/core\/internal\//</g이고-e옵션 이나 옵션이 없기 때문에-f, 이것은 sed 스크립트입니다. (이것은 grep pattern file...유사하게 작동 하며 grep -e pattern file...동일한 작업을 수행합니다.)

표준 동작은 옵션이 첫 번째 명령줄 인수로 나타나야 한다는 것입니다. 따라서 첫 번째 비옵션 이후에는 대시로 시작하더라도 나머지는 옵션으로 해석되지 않습니다. 따라서 .sed-e

이는 GNU에서도 다릅니다. 예를 들어 는 ls dir -l와 동일 ls -l dir하지만 표준이 아니며 Mac의 BSD sed도 이를 지원하지 않습니다. GNU에서는 sed 스크립트 및 파일 이름으로 옵션으로 sed foo -e bar인식됩니다 . 하지만 표준 해석에 따르면 스크립트 와 파일 이름이 됩니다 .-ebarfoofoo-e-bar


문제를 해결 -i하면 나머지는 제자리에 있게 됩니다. Mac에서 백업 파일 없이 옵션을 사용하려면 다음을 -i사용하세요.

sed -i '' -e something -e something file...

이는 sed -i.baksed 버전 중 하나에서 작동하며 백업 접미사 를 .bak.sed -i .bak

답변2

좋아요, 내 해결책은 다음과 같습니다.

sed -i '' -e 's/<azure\/core\/internal\//<azure-sdk-for-c\//g;s/<azure\/core\//<azure-sdk-for-c\//g;s/<azure\/iot\/internal\//<azure-sdk-for-c\//g;s/<azure\/iot\//<azure-sdk-for-c\//g' ./azure-sdk-for-c/*

관련 정보