&&を含む文字列をsedに置き換えます。

&&を含む文字列をsedに置き換えます。

技術承認テストを自動化するためのいくつかのスクリプトを作成しました。パスワードをプレーンテキストとして書き込むことは許可されていないため、私が使用するスクリプトは複数の変数に関連付けられており、そのうちの1つはパスワードです。実行する前に、password.key=mycryptedpasswordファイルからその行を取得し、パスワードを復号化してスクリプトで使用します。その後、キーをスクリプトで使用される一時ファイルのパスワードに置き換えようとしました。ここで問題が発生します。次のコードを使用します。

sed -i -e 's/$key/$decryptedPassword/g' json.tmp

一般的にはうまくいきますが、私が出会ったパスワードの1つは次のとおりです。cl&&TiT8

sedとlinux(私は基本的にredhatでkshシェルを使用しています)にこれらの&&。もしかしたらこんなに奇妙なパスワードを使う方に会うかと心配になるのにどう対処すればいいですか?

概要:これが私がしたことですsed -i -e 's/$key/$decryptedPassword/g' json.tmp。当時、$decryptedPassword = cl&&TiT8これはうまくいきませんでした。

答え1

sedでこれを行うと、そのs/regexp/replacement/文字&replacement特別な意味を持ち、その文字が表示されると一致する文字列に展開されますregexp。したがって、次のようにエスケープする必要があります\

sed -i -e 's/$key/cl\&\&TiT8/g' json.tmp

/また、and'\andもエスケープする必要があります$key$decryptedPassword

sedコマンドを置き換える方法は$key$decryptedPassword

答え2

  • '$key'私は判断しませ$key"$key"

努力する

d2=$(echo "$decryptedPassword" | sed -e 's.&.\\\&.g' )
sed -i -e "s/$key/$d2/g" json.tmp
  • 提供も含まれてい$keyません$decryptedPassword/
  • 交換モードで使用する必要があるため、最初にany -をこれに置き換える必要があり\&ます。また、および&すべてをエスケープする必要があることを考慮して、\&\\\&内部に「セド

  • 両方's.&.\\&.g' です's.&.\\\&.g'

  • with 's.&.\\&.g', \エスケープ自体, while&置換&(sed 置換によって)
  • with 's.&.\\\&.g'\独自にエスケープして '\&' を置き換えます (sed 置換なし)。

関連情報