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