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スクリプトです(重複した言及を避けるだけですMASQUERADE_AS):

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

関連情報