sedとsshで引用符を使用する方法は?

sedとsshで引用符を使用する方法は?

bash / rhel 7では機能しません。

ssh host "sed -i -e \"s/dnl MASQUERADE_AS.*\$/MASQUERADE_AS(\`domain.com\')dnl/\" /etc/mail/sendmail.mc"

bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file

私は基本的に通常のコマンドラインでは動作しますが、sshでは中断されるこのsedが欲しいです。

sed -i -e "s/dnl MASQUERADE_AS.*$/MASQUERADE_AS(\`domain.com\')dnl/" /etc/mail/sendmail.mc

誰にもアイデアがありますか?ありがとう。

答え1

使用ジェフの考えスクリプト自体についてはこちらのドキュメントを使用してくださいsed(まあ、彼は「ここに文字列」を言及しましたが、そこでも参照するのに問題があると思います)。

ssh host 'sed -i -f - /etc/mail/sendmail.mc' <<'SED_END'
s/dnl MASQUERADE_AS.*/MASQUERADE_AS(`domain.com')dnl/
SED_END

sedリモートホストのスクリプトがsed標準入力読み取りを使用できる場合は、これが機能する可能性があり-f -ます(そうでない場合は、たとえば一部のBSDシステムでは試してください-f /dev/stdin)。

このコマンドはsedリモートホストを呼び出し、sed標準入力として編集スクリプトを渡します。sedの引用符のため、スクリプトは一重引用符で囲まれて'SED_END'いるため、シェルはテキストの内容を拡張しようとしません。

$また、必要ないので、正規表現から末尾を削除しました(.*とにかく行の終わりと一致します)。

少し短いsedスクリプト(2回言及しないためMASQUERADE_AS):

s/dnl \(MASQUERADE_AS\).*/\1(`domain.com')dnl/

関連情報