使用sed替换以string开头的整行的第一个实例

时间:2013-03-08 23:16:19

标签: bash sed

我正在尝试编写一个bash脚本,它将使用sed替换以给定字符串开头的文本文件中的整行,我只希望它为第一次匹配执行此替换。

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

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

我可能只想用不同的数字替换第一次出现的以“age”开头的行而不影响第二个年龄实例:

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

到目前为止,我已经提出了

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

但这只会替换字符串“age”本身而不是整行。我一直试图在那里扔一个“\ c”来改变整条线,但到目前为止还没有任何工作。有没有人对如何解决这个问题有任何想法?感谢。

2 个答案:

答案 0 :(得分:2)

像@ruakh建议的那样,你可以使用

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

更短且重复性更低的方法是

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

利用反向引用以及未在s表达式中指定模式的事实将使用先前匹配的模式。

答案 1 :(得分:0)

0,... - 范围仅适用于GNU sed。另一种方法是使用sed的shell重定向:

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

或使用awk

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