電子メールアドレスを含むPHPファイルがあり、$to = "example-1_2@example-1_2.com";
その電子メールアドレスを端末から直接別のアドレスに置き換えたいと思います。
次のコードは以下に基づいています。Kuslanadaの他の同様のコード働く:
read new_email_address
sed -i 's/$to = ".*";$/$to = "'"$new_email_address"'";/' FILE
Kuslanandaはコメントで次のように語った。
- 私の表情は一連の一重引用符で囲まれた文字列、二重引用符で囲まれた文字列(変数)、別の短い二重引用符で囲まれた文字列
2年に1回使用する非専門的なシステム管理者として、sed
私はこの構文を覚えるのがやや難しく、定期的に使用しない私のような人には多少混乱していると思います(Kuslanandaが提供した引用規則は少し混乱しています)。私は、 コマンド全体sed
が一般的に一重引用符で囲まれていることは言うまでもありません。
コマンドを分離するバックスラッシュが役に立つかもしれませんし、他のユーティリティがこの種のテキスト置換を実行するのに適しているかもしれません。
コマンドラインから(PHP)ファイルの電子メールを置き換える方法いいえ sed
?
答え1
引用シェル変数は、外部引用レベルが二重引用符で囲まれている場合にのみ拡張されます。表示するには:
$ var=foo
$ echo '"$var"'
"$var"
$ echo "'$var'"
'foo'
したがって、変数は次の場合にのみ拡張されます。外の周辺の提案レベルは2倍です。
次の問題は正規表現が間違っていることです。$
正規表現では「行末」を意味するため、これらのうちの1つ以上を持つことはできません$
。この正規表現で何をしたいのかわかりません。したがって、文字列の後ろにあるEメールアドレスを変更したいとします$to =
。その場合は、以下を試してください。
sed -i "s/\\$to = \"[^\"]*\"/\\$to = $new_email_address/" FILE
変数で読み取るのを防ぐために"
(\"
)と$
()をエスケープする必要があるため、開口部は内部で閉じられていません。また、シェルがそれを見ずに代わりにsedに渡すように別のエスケープレイヤー()を追加する必要がありました。はい、これは非常に複雑であることを知っています。\$to
$to
"
"
\\$
$
あるいは、必要に応じて複数の単一引用符と二重引用符式に分割することもできます。
sed 's/\$to = "[^"]*"/$to = '"$new_email_address"'/' FILE
答え2
あなたはそれを使用することができますアッユーティリティは、コマンドラインで-Fオプションを使用して設定された区切り文字で区切られたフィールドに基づいて行を表示します。
read new_email_address
awk -F '"' -v new="$new_email_address" '
$1 == "$to = " {$2 = new}
1' OFS='"' your_phpfile
awk -v q=\" -v new="$new_email_address" '
BEGIN {
new_esc = new
gsub(/[&]/, "\\\\&", new_esc)
repl = q new_esc q";"
}
sub(\
/\$to = ".*";$/, \
"$to = " repl \
)+1' your_phpfile