簡體   English   中英

sed:僅將第一個實例替換為包含bash變量的字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM