如何在沒有 sed 的情況下從命令行替換(PHP)文件中的電子郵件?
我有一個 PHP 文件,其中包含一個電子郵件地址,
$to = "example-1_2@example-1_2.com";
我想直接從終端將電子郵件地址替換為另一個。以下程式碼基於Kuslanada 的另一個類似程式碼工作:
read new_email_address sed -i 's/$to = ".*";$/$to = "'"$new_email_address"'";/' FILE
Kuslananda 在評論中告訴我(釋義):
- 我的表達式是一個單引號字元串、一個雙引號字元串(變數)和另一個短單引號字元串的連接
作為一個非專業的系統管理員,我可能會
sed
在兩年內使用一次,我發現它的語法有點難以記住,並且對於像我這樣不經常使用它的人來說有些混亂(Kuslananda 提供的引用規則有點令人困惑對我來說,當整個sed
命令通常由它們自己單引號時更不用說)。也許有一種方法可以讓 Kusalananda 的命令對於其他人和我自己來說更加“直覺”或“易於理解”。也許一些反斜杠將命令分解成碎片會有所幫助,或者也許另一個實用程序對我來說會更好地進行這樣的文本替換。
如何在沒有 的情況下從命令行替換(PHP)文件中的電子郵件
sed
?
您可以使用awk實用程序,它根據您在命令行上使用 -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
僅當外部引用級別是雙引號時,引用的 shell 變數才會被擴展。為了顯示:
$ var=foo $ echo '"$var"' "$var" $ echo "'$var'" 'foo'
因此,變數只有在它們周圍的外部引號是雙倍時才會被擴展。
下一個問題是你的正則表達式是錯誤的。
$
在正則表達式中的意思是“行尾”,所以你不能$
像這樣在裡面有多個。我真的不明白你想用那個正則表達式做什麼,所以我假設你想更改在 string 之後找到的電子郵件地址$to =
。如果是這樣,試試這個:sed -i "s/\\$to = \"[^\"]*\"/\\$to = $new_email_address/" FILE
我必須轉義
"
(\"
) 和$
(\$to
) 以避免$to
被讀取為變數,因此內部"
不會關閉開口"
。我還必須添加另一層轉義 (\\$
) 以便$
shell 看不到它,而是將其傳遞給 sed。是的,我意識到這非常複雜。或者,您可以將它分成多個單引號和雙引號表達式,就像我認為您嘗試做的那樣:
sed 's/\$to = "[^"]*"/$to = '"$new_email_address"'/' FILE