web-dev-qa-db-ja.com

sed呼び出しで複数のバックティックをエスケープする

複数のSQLステートメントで検索と置換を繰り返し実行する必要があります。

から:

CREATE TABLE `Old_Name` (

に:

ALTER TABLE `Old_Name` RENAME TO `New_Name`

上記のクエリには、バックティック`が含まれています。私は以下をやってみました

sed -i -r "s/CREATE TABLE \`$search\` \(/ALTER TABLE \`$search\` RENAME TO \`$replacement\`/g" /query.txt;

代わりに、コマンドラインにEnterを作成します。しかし、$replacementの後ろにスペースを追加すると、正常に実行されます。しかし、New_Nameの後にスペースを入れたくありません。

これが実際にバックティックによって引き起こされているのか、変数名の補間の問題であるのかはわかりません。いずれにせよ、この問題を解決するにはどうすればよいですか?

8

エスケープを最小限に抑えるには、次のように、sedとともに一重引用符を使用することをお勧めします

sed 's/pattern/repl/g'

(単一引用符では、恐れることなく、エスケープせずにバックティックを自由に使用できます)。
sedスクリプトでシェル変数を使用する必要がある場合は、次の例のように一重引用符と二重引用符を組み合わせます

var="bbb"
thing=foo
sed 's/aaa'"${var}"'ccc/some'"${thing}"'else/g'

それは次の連結としてよりよく見ることができます

's/aaa' + "${var}" + 'ccc/some' + "${thing}" + 'else/g'
10
enzotib