1

我正在尝试编写一个 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”来改变整条线,但到目前为止没有任何效果。有没有人对如何解决这个问题有任何想法?谢谢。

4

2 回答 2

2

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

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

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

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

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

于 2013-03-08T23:32:01.923 回答
0

0,...-ranges 仅适用于GNU sed. 另一种方法可能是使用 shell 重定向sed

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

或使用awk

awk '$1=="LABEL" && !n++ {$2="VALUE"}1' FS=\\= OFS=\\= file
于 2013-03-09T12:08:57.017 回答