[英]sed: replace first instance only with string containing bash variable
這是“ 如何使用sed僅替換文件中的第一個匹配項 ”的后續內容。 但要有針對性的詢問。 給定一個文件
Peach: data/file1.txt
Apple: data/file2.txt
Pear: data/file3.txt
Apple: data/file4.txt
目標是將包含Apple的第一行替換為包含固定字符串(Banana)和bash變量的新行。 在新的輸出中,第二行現在是:
Banana: newdata/data.txt
這是最近的嘗試...
BananaVariable=newdata
sed -i -E "0,|(Apple).*|{s|(Apple:).*|Banana: "$BananaVariable"/data.txt|}" filename
但是,這會產生錯誤:
sed: -e expression #1, char 3: unexpected `,'
我認為我需要在$ BananaVariable周圍使用雙引號進行轉義,以便可以插入實際的字符串而不是“ BananaVariable”,但是我認為這些雙引號引起了問題。 (OS是CentOS 7,sed是GNU版本)
來自man sed
:
/regexp/
Match lines matching the regular expression regexp.
\cregexpc
Match lines matching the regular expression regexp. The c may
be any character.
因此,在您的原始命令中替換前兩個欄|
用斜杠/
(等效地,將第一個|
替換為\\|
):
sed -i -E "0,/(Apple).*/{s|(Apple:).*|Banana: $BananaVariable/data.txt|}" filename
您還可以縮短命令:
sed -i -E "0,/^Apple/s|.*|Banana: $BananaVariable/data.txt|" filename
輸出:
Peach: data/file1.txt
Banana: newdata/data.txt
Pear: data/file3.txt
Apple: data/file4.txt
使用awk
更容易:
var='newdata/data.txt'
awk -v v="$var" 'BEGIN{FS=OFS=": "}
!p && $1 == "Apple"{$1="Banana"; $2=v; p=1} 1' file
Peach: data/file1.txt
Banana: newdata/data.txt
Pear: data/file3.txt
Apple: data/file4.txt
這可能對您有用(GNU sed):
sed -i -e '0,/Apple/!b;//cBanana: '"$BananaVariable"'/data.txt' file
如果在文件的開頭之間沒有一行,直到包含Apple
的一行正常打印為止。 否則,使用變量將包含Apple
的行更改為所需的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.