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

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

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

答え1

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'

関連情報