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