Bash

如何在沒有 sed 的情況下從命令行替換(PHP)文件中的電子郵件?

  • March 15, 2021

我有一個 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

引用自:https://unix.stackexchange.com/questions/639125