Sed

為什麼帶有多個 -esed 在 macOS Monterey 上會出現錯誤?

  • December 20, 2021

在 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

好的,這是我的解決方案:

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/*

就像評論中提到的那樣,BSD 版本的 sed-i採用強制參數,因此在 中sed -i -e-e成為該參數,用於備份文件的文件名後綴。然後,您的命令中的下一個參數是s/<azure\/core\/internal\//</g,並且*由於沒有看到-eor-f*選項,這就是 sed 腳本。(這類似於兩者grep pattern file...grep -e pattern file...工作方式和做同樣的事情。)

標準行為是選項必須作為第一個命令行參數出現。因此,在第一個非選項之後,其餘部分不會被解釋為選項,即使它們以破折號開頭。所以sed將它們作為文件名,以-e.

這在 GNU 上也有所不同,其中 egls dir -lls -l dir. 但它不是標準的,mac上的BSD sed不支持它。在 GNU 上,sed foo -e bar將辨識-e為一個選項,將bar其作為 sed 腳本和foo文件名。但使用標準解釋,foo將是腳本-e-bar文件名。


用 修復問題-i,剩下的就到位了。要-i在 Mac 上使用沒有備份文件的選項,請使用

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

請注意,sed -i.bak這可以使用任一版本的 sed 將備份後綴設置為.bak. (但sed -i .bak不會)

引用自:https://unix.stackexchange.com/questions/683104