'特殊文字を含むSedコマンド

'特殊文字を含むSedコマンド

Bashシェルで次のコマンドを実行しようとしています。

sed -i "s/\(update.*\)where /\1 where primary_id = '$primary_id', /" *.php

ご覧のとおり、私はsedを使用して変数を挿入しています'$primary_id'。コマンドの実行後に表示されたが欠落している'こと$primary_idを確認しました。

たとえば、特殊文字を処理する方法は '

答え1

これをもう少し簡単にしましょう。a'$b'dollar、ab)の各項目を一重引用符で置き換えようとします。c$b変数に発生する拡張は望むものではありません。

b=c
sed -i "s/a/'$b'/g" *.php

上記のコマンドは、質問で実行したコマンドと似ています。文字列s/a/'$b'/gが二重引用符で囲まれているため、変数が拡張されて文字列が'c'

コマンドsed全体を二重引用符で囲んだ場合は、エスケープする必要があります$。解決策は次のとおりです。

sed -i "s/a/'\$b'/g" *.php\

別の可能性は、シェルに特別な意味を持つ文字を除いて何も引用しないことです(推奨されませんが、潜在的に洞察力があります)。

sed -i s/a/\'\$b\'/g *.php

答え2

私が誤解しない限り、コマンドは期待どおりに正しく動作します。

$ cat test_file 
update name where a='b'
$ export primary_id="test"
$ sed -i "s/\(update.*\)where /\1 where primary_id = '$primary_id', /" test_file
$ cat test_file 
update name  where primary_id = 'test', a='b'

答え3

■ 先頭の特殊文字は\文字通り処理されます。
(括弧:(\( \))と同様)。

次のようにする必要があります\'
それでも機能しない場合は、以下を試してください'\''
または、16進エスケープシーケンスを使用してみてください\x27

また、次のようにsed:表現を囲みます。
一つ 引用符's/1/2/g')。 いいえ ダブルス "s/1/2/g"


sed -i 's/\(update.\*\)where /\1 where primary_id = \'$primary_id\', /' \*.php  

sed -i 's/\(update.\*\)where /\1 where primary_id = '\''$primary_id'\'', /' \*.php

sed -i 's/\(update.\*\)where /\1 where primary_id = \x27$primary_id\x27, /' \*.php

関連情報