使用 sed 替換字串的一部分

使用 sed 替換字串的一部分

我計劃替換文件中的某些字串;所以我使用 sed 。

我想替換該字串,而 sed 讀取該字串並將文字附加到字串中間。

例子:

string in myfile : user=blabla
string that I want to obtain: user=bob

所以我以這種方式運行 sed,讓它搜尋“user=”字串,並將其替換為“user=bob”

sed -i 's/user=*/user=bob/' myfile

我得到的是

user=bobblabla

基本上 sed 認為我只想替換該部分,而我想用新字串替換整個字串。我以為 * 會告訴 sed 考慮後面的任何內容,但它不起作用。

由於我不知道「blabla」是什麼,所以我無法將其放入 sed 指令中。如何告訴 sed 查找以“user=”開頭的字串並將整個字串替換為新字串?

答案1

您似乎將 shell 模式與正規表示式混淆了。在 shell 模式中,*表示零個或多個任意字元。在正規表示式中,這是sed其模式所期望的,*意味著零個或多個前一個原子。在您的範例中,該原子是=.因此,sed搜尋後跟user零個或多個=並將匹配的字串替換為user=bob。您想要的模式是user=.*,後面跟著user=任何字元 ( .) 零次或多次,使您的sed命令:

sed -i 's/user=.*/user=bob/' myfile

答案2

正如加里約翰所說,你的正規表示式錯了。 (* -> .*)

但我會更進一步,當你在做的時候......我不知道你的文件實際上是什麼樣的,但為了練習,我會考慮讓你的搜尋/替換操作更安全一些。

假設你想在一個文件上運行這個東西,如下所示:

user=john
superuser=jimmy      # don't want to change this line!
user=L33t_us3rn4m3   # that should work too, and these comments should remain intact as well, btw
# in the line below, I want to change user=hello to user=bob
# but in the comments, "user=hello" should remain intact
user=hello

使用您目前的 sed 語法,這將是非常錯誤的。為了使其更具體一點,您可以嘗試:

sed -i 's/^user=[A-Za-z0-9_]*/user=bob/g' /tmp/myfile

這會:

  • 僅當該行實際以“user”(^)開頭時觸發
  • 僅變更包含 0 個或多個字母、數字或底線的“user=”
  • 保留用戶名後面的所有內容(即我的範例中的註釋)

這絕不是一個超級安全的東西,可以在您想要重命名用戶的任何地方隨時隨地工作。顯然,這取決於您的設定檔的設定方式以及您期望遇到的情況。但我的回答是為了提供一些“深思熟慮”,因為給定一個(數量)配置文件足夠大,以至於有這麼多用戶名不想手動執行此操作,盲目地替換“user=.*” “似乎可能很危險。您可能需要花一些時間來完善這些類型的操作:)

祝你好運。

相關內容