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
인식됩니다 . 하지만 표준 해석에 따르면 스크립트 와 파일 이름이 됩니다 .-e
bar
foo
foo
-e
-bar
문제를 해결 -i
하면 나머지는 제자리에 있게 됩니다. Mac에서 백업 파일 없이 옵션을 사용하려면 다음을 -i
사용하세요.
sed -i '' -e something -e something file...
이는 sed -i.bak
sed 버전 중 하나에서 작동하며 백업 접미사 를 .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/*