web-dev-qa-db-ja.com

Mac OS Xでsedを使用した文字列置換の何が問題になっていますか?

#Banner noneBanner /etc/sshd_banner内の/etc/sshd_configに置き換えたい。走ったら

Sudo sed -i "s/#Banner none/Banner \/etc\/sshd_banner" /etc/sshd_config

次のエラーが表示されます

sed:1: "/ etc/sshd_config":終了していない代替パターン

この問題を修正する方法についてのアイデアはありますか?

19
Technic1an

別の区切り文字を使用

ここにある"広告区切り文字を使用します

Sudo sed -i "" "s|#Banner none|Banner /etc/sshd_banner|" /etc/sshd_config

区切り文字を変更すると、/をエスケープする必要がありません

元の投稿は最後に/を1つ逃しました。

OS Xマニュアルから

-i extension
         Edit files in-place, saving backups with the specified extension.  If a zero-length extension
         is given, no backup will be saved.  It is not recommended to give a zero-length extension when
         in-place editing files, as you risk corruption or partial content in situations where disk
         space is exhausted, etc.

zero-length = ""

28
Jotne

コマンドに関する3つの問題:

  1. 終端の/がありません。
  2. とにかく/を区切り文字として使用することはできません。この文字は、置換または置換しようとしている文字列に含まれているためです。区切り文字として、パイプ文字などの別の文字を使用する必要があります。
  3. Mac OS Xに同梱されているsedのバージョン(BSD)では、-iフラグは必須<extension>引数を必要としますが、コマンドはありません。このバージョンのsedを使用してファイルをその場で編集する場合は、""フラグの後に空の文字列(-i)を続ける必要があります。

要約すると、試してください

Sudo sed -i "" "s|#Banner none|Banner /etc/sshd_banner|" /etc/sshd_config
23
jub0bs

一重引用符を試してください。また、一部のSedでは、/以外のものを使用する場合は、最初の区切り文字をエスケープする必要があります。

Sudo sed -i 's\:#Banner none:Banner :etc/sshd_banner:' /etc/sshd_config

もう1つは、#が行末まで続くコメントとして解釈される可能性があることです。

0
Fernando Basso