Sed

如何直接在文件中將電子郵件地址更改為另一個?

  • March 14, 2021

假設我有一個包含以下程式碼行的 PHP 文件:

$to = "example-1_2@example-1_2.com";

我只想將兩個雙引號之間的電子郵件地址更改為example@example.com)。

我試過這個失敗了:

read new_email_address
sed -i 's/^[a-zA-Z0-9-_]*$@^[a-zA-Z0-9-_]*$.^[a-z]*$/"${new_email_address}"/g' FILE

只是對您問題中更新命令的簡短評論sed,目前為

sed -i 's/^[a-zA-Z0-9-_]*$@^[a-zA-Z0-9-_]*$.^[a-z]*$/"${new_email_address}"/g' FILE

請注意,這包含兩個無效字元範圍(均為 read 0-9-_),並且該變數new_email_address不會被 shell 擴展,因為它位於單引號字元串中。我也不確定 and 的意圖是什麼$@^$.^因為$and^將在表達式中的這些位置逐字匹配這些字元。


沒有看到該$to變數在文件的其餘部分中是如何使用的,我將假設它只分配到一個地方,並且您顯示的行與文件中的行完全一樣。

sed 's/$to = ".*";$/$to = "'"$new_email_address"'";/' file >file.new

嘗試匹配電子郵件地址是沒有意義的,因為我們已經知道該$to變數包含一個電子郵件地址。我們唯一需要擔心的是試圖找到正確的線路。用正則表達式匹配電子郵件地址是出了名的困難

這裡有幾點需要注意:

  • $in$to不需要特殊處理,因為它沒有出現在表達式的最後。如果您使用-E啟用擴展正則表達式,那麼首先,不要,其次,像在模式中一樣轉義$in 。$to``\$
  • 該字元串$to不會視為 shell 變數,因為它位於單引號內。
  • $new_email_address 一個shell變數,所以我們暫時打破單引號來引入該變數的值,雙引號。

我建議不要-i在這裡使用,因為您還不知道替換是否正確或是否會弄亂文件。最好將結果寫入新的文件名。

此外,使用-ir,您指示sed用作r備份文件後綴。我假設您想使用該選項-r(或-E,這將更普遍支持)。但是,既不需要-r也不-E需要,因為我們沒有使用任何擴展的正則表達式來進行這種簡單的替換。

測試上面的命令:

$ cat file
$to = "example-1_2@example-1_2.com";
$ new_email_address=myself@my.host.here.net
$ sed 's/$to = ".*";$/$to = "'"$new_email_address"'";/' file >file.new
$ cat file.new
$to = "myself@my.host.here.net";

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