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