Sed為什麼帶有多個
為什麼帶有多個 -e
的 sed
在 macOS Monterey 上會出現錯誤?
在 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
,並且*由於沒有看到-e
or-f
*選項,這就是 sed 腳本。(這類似於兩者grep pattern file...
的grep -e pattern file...
工作方式和做同樣的事情。)標準行為是選項必須作為第一個命令行參數出現。因此,在第一個非選項之後,其餘部分不會被解釋為選項,即使它們以破折號開頭。所以
sed
將它們作為文件名,以-e
.這在 GNU 上也有所不同,其中 eg
ls dir -l
與ls -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
不會)