GNUとBSDでsedコマンドを機能させるにはどうすればよいですか?

GNUとBSDでsedコマンドを機能させるにはどうすればよいですか?

~/.ssh/config にコンテンツブロックがあります。 「#BEGIN AUTO GENERATED CONTENT」行で始まり、「#END AUTO GENERATED CONTENT」行で終わります。

これらの2行間の内容を置き換えるコマンドがあります。内容は「config」というファイルから読み込まれます。

sed -i -ne '/# BEGIN AUTO GENERATED CONTENT/ {p; r config' -e ':a; n; /# END AUTO GENERATED CONTENT/ {p; b}; ba}; p' ~/.ssh/config

Ubuntuではうまく動作しますが、bsd sedを使用するMacでは動作しません。次のエラーメッセージが表示されます。

sed: 1: "/# BEGIN AUTO GENERATED ...": unexpected EOF (pending }'s)

bsdで動作するには、このコマンドを変更する必要があります。 Macではgsedを使用しないでください

ベストアンサー1

まず、Macを使用しているため、個々の-iオプションは機能しません。あなたの場合はnullの場合は値を指定する必要があります。

第二に、スイッチはすでに適用されているので、状況に応じてp;bペアを変更できます。以前のバージョンでは、ブランチコマンドは閉じた中括弧とうまく機能しませんでした。p;d-nbseds

$ sed -i '' -ne '/# BEGIN AUTO GENERATED CONTENT/{' -e 'p;r config' -e ':a;n' -e '/# END AUTO GENERATED CONTENT/{' -e 'p;d' -e '}' -e 'ba' -e '}' -e 'p' ~/.ssh/config

これが使用して廃棄されていない場合は、ファイルに書き換えて次のように呼び出すことをお勧めします。

$ sed -i '' -nf ./code ~/.ssh/config

$ cat ./code
   /# BEGIN AUTO GENERATED CONTENT/{
      p
      r config
      :loop
         n
         /# END AUTO GENERATED CONTENT/{
            p
            d
         }
      bloop
   }
   p

おすすめ記事