次のコード行を含むPHPファイルがあるとします。
$to = "example-1_2@example-1_2.com";
)を表すために、2つの二重引用符の間でEメールアドレスを変更したいと思います[email protected]
。
私は成功せずにこれを試しました。
read new_email_address
sed -i 's/^[a-zA-Z0-9-_]*$@^[a-zA-Z0-9-_]*$.^[a-z]*$/"${new_email_address}"/g' FILE
答え1
あなたの質問に更新されたコマンドの簡単な説明がありますsed
。現在、次のようになります。
sed -i 's/^[a-zA-Z0-9-_]*$@^[a-zA-Z0-9-_]*$.^[a-z]*$/"${new_email_address}"/g' FILE
これには2つの無効な文字範囲(両方ともread 0-9-_
)が含まれ、変数はnew_email_address
一重引用符で囲まれた文字列内にあるため、シェルによって拡張されません。また、$@^
andの意図が何であるかよくわかりません$.^
。なぜなら、$
andは^
式の対応する位置にある文字を文字通り一致させるからです。
この変数がファイルの残りの部分でどのように使用されるかを見ず、$to
この変数が1つの場所にのみ割り当てられ、表示される行がファイルの行とまったく同じであるとします。
sed 's/$to = ".*";$/$to = "'"$new_email_address"'";/' file >file.new
$to
変数にEメールアドレスが含まれていることはすでにわかっているので、Eメールアドレスを一致させようとする必要はありません。私たちが心配しなければならなかった唯一のことは、正しい線を見つけようとすることでした。電子メールアドレスを正規表現と一致させることは、次のような場合に悪名高いです。硬い。
以下は参考にするいくつかの点です。
- inは式の末尾には表示されないため、特別な処理は必要ありません
$
。拡張正規表現を有効に$to
するには-E
、まずこれを実行せず、2番目にパターンの$
ようにinをエスケープします。$to
\$
- この文字列
$to
はいいえ一重引用符で囲まれているため、シェル変数として扱われます。 $new_email_address
はいシェル変数なので、変数値(二重引用符)を導入するために一時的に一重引用符を区切ります。
-i
置換が正しいか、ファイルが混乱しているかはまだわからないため、ここでは使用しないことをお勧めします。結果を新しいファイル名に書き込むことをお勧めします。
また、を渡してバックアップファイルとして使用するサフィックスを-ir
示します。私はあなたがそのオプション(またはより一般的にサポートされているもの)を使用したいと思います。ただし、この単純な置換には拡張正規表現を使用しないため、どちらも必要ありません。sed
r
-r
-E
-r
-E
上記のコマンドをテストしてみてください。
$ cat file
$to = "example-1_2@example-1_2.com";
$ [email protected]
$ sed 's/$to = ".*";$/$to = "'"$new_email_address"'";/' file >file.new
$ cat file.new
$to = "[email protected]";
答え2
(1)が2つの二重引用符の間にあり、(2)の間に@の文字列を置き換えるには、次の正規表現が一致します。
"[a-zA-Z_.-]*@[a-zA-Z_.-]*"
ダッシュは各文字クラスの末尾になければならず、@の前後にドットを追加しました。
理論的には、%などの他の文字も可能です。調査後、Eメールアドレスとこれよりも一致する正規表現を見つけることができますが、私たちはあなたのEメールアドレスがこの式と一致すると仮定します。
問題はsed
プログラムの代替文字列にあります。これにはシェル変数が含まれ、正規表現には二重引用符が含まれているため、二重引用符の間に入れる必要があります。
私の考えでは、この問題を処理する最も簡単な方法は二重引用符の前にバックスラッシュを追加することです。例えば
sed "s/\"[a-zA-Z0-9_.-]*@[a-zA-Z0-9_.-]*\"/\"${new_email}\"/"