Sed
如何直接在文件中將電子郵件地址更改為另一個?
假設我有一個包含以下程式碼行的 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";