2016-03-21 13 views
0

私はSSH上の画面でいくつかのコマンドを実行しています。これは完璧に動作します:引用符をエスケープするBash

ssh [email protected] "screen -list; screen -r -d -X -S myscreen stuff $'echo here\n'" 

しかし、今ではなくエコーよりも、私は二重引用符が含まれているsedコマンドを実行しようとしています。

sed -i -r "s/( host:)(\w+)/\1test/" file.yml 

二重引用符は、bashのを引き起こしている:予期しないトークン `database_nameに近い構文エラー:」

どのように適切にSEDのために必要な二重引用符をエスケープしますか?

+1

なぜ二重引用符が必要ですか?これはあなたのsedコマンドの回りに一重引用符で動作するはずです。あなたはそれに展開したい何も持っていません。 –

+0

一重引用符は、stuffコマンドの一重引用符と干渉します。ここでechoをsedコマンドに置き換えようとしています。 – Tim

+0

''\' ''を使用すると、他の単一引用符の中に単一引用符を引用することができます。 –

答えて

0

これを行う最も簡単な方法は、2つのコマンドに分けることです。

最初にコマンドを画面に送信します。 stuffコマンドの二重引用符をバックスラッシュでエスケープします。

ssh [email protected] 'screen -list; screen -r -d -X -S myscreen stuff "sed -i -r \"s/( host:)(\w+)/\1test/\"" file.yml' 
         └────────────────────────────────────────────────────────────────────────────────────────────┘ 
                     └──────────────────────────────────────┘ 

次に、コマンドを実行するためにリターンを送信します。実行する$に注意してください。

ssh [email protected] "screen -list; screen -r -d -X -S myscreen stuff $'\n'" 
         └─────────────────────────────────────────────────┘ 
                      └──┘ 
関連する問題