2013-03-08 58 views
1

我正在嘗試編寫一個bash腳本,它將使用sed替換以給定字符串開頭的文本文件中的整行,而我只希望它爲第一場比賽執行此替換。使用sed替換以字符串開頭的整行的第一個實例

例如,在我的文本文件我可能有:

hair=brown 
age=25 
eyes=blue 
age=35 
weight=177 

我可能要簡單地替換行中首次出現帶「年齡」與不同數量的開始,而不會影響的第二個實例年齡:

hair=brown 
age=55 
eyes=blue 
age=35 
weight=177 

到目前爲止,我想出了

sed -i "0,/^PATTERN/s/^PATTERN/PATTERN=XY/" test.txt 

但這種意志只替換字符串「年齡」本身而不是整行。我一直在試圖在某處拋出一個「\ c」來改變整條線,但目前爲止沒有任何工作。有沒有人有任何想法如何解決這個問題?謝謝。

+2

我敢肯定有人會發表一個更好的方法,但你的腳本中的最小變化是寫' sed -i「0,/^PATTERN/s/^ PATTERN =。* $/PATTERN = XY /」test.txt「(因爲'。* $'與該行的其餘部分相匹配)。 – ruakh 2013-03-08 23:19:46

+0

是否有可能使用'AGE ='''AGE'開頭的示例替換行來重寫解決方案? – Turgs 2017-06-20 07:28:29

回答

1

像@ruakh建議,您可以使用

sed -i "0,/^PATTERN/ s/^PATTERN=.*$/PATTERN=XY/" test.txt 

做同樣的短,少重複的辦法是

sed -i '0,/^\(PATTERN=\).*/s//\1XY/' test.txt 

這需要反向引用的優勢,事實上,不指定s表達式中的模式將使用先前匹配的模式。

0

0,... -ranges只能工作在GNU sed。另一種可能是使用貝重定向與sed

{ sed '/^\(PATTERN\).*/!n; s//\1VAL;q'; cat ;} < file 

或使用awk

awk '$1=="LABEL" && !n++ {$2="VALUE"}1' FS=\\= OFS=\\= file 
相關問題