我計劃替換文件中的某些字串;所以我使用 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=.*” “似乎可能很危險。您可能需要花一些時間來完善這些類型的操作:)
祝你好運。