2010-07-21 52 views
0

我有一个属性文件,其中,未改性时具有下面的行:追加使用sed对线,增加分离器如有必要

worker.list= 

我想用sed追加到该行的值,使得SED运行后,该文件中的行写着:

worker.list=test 

但是,当我运行该脚本第二次,我想SED拿起一个值已经增加,从而增加了一个分隔符:

worker.list=test,test 

这是我的树桩位(sed的坦白让我害怕与它的力量,但是这是我的问题!)

丰富

回答

2

那容易!如果你正在运行GNU sed的,你可以写它,而短

sed -e '/worker.list=/{s/$/,myValue/;s/=,/=/}' 

这将添加“ myvalue的”的路线,然后在等号后删除逗号(如果有的话)。

如果你被困在其他一些平台,你需要打破它除了像这样

sed -e '/worker.list=/{' -e 's/$/,myValue/' -e 's/=,/=/' -e '}' 

这是一个非常愚蠢的脚本,它不知道值等所有脑干(我想你可以做一个更详细的解析,但你为什么?),但我想这就是它的美丽。哦,它会破坏这样的

worker.list=,myval 

线将变成

worker.list=myval,test 

如果这是一个问题,让我知道,我会解决这个问题你。

HTH。

+0

我有一个问题,因为我也在学习SED相当于:你为什么不需要在第一个sed表达式'sed -e'/worker.list =/{s/$ /,myValue /; s/=,/ = /}''结尾处结束'/' '? – 2010-07-21 08:21:03

+0

谢谢 - 现在很明显,我已经看到它!我不知道你可以像这样连接操作。很高兴知道。 – Rich 2010-07-21 08:21:37

+0

@Alberto;在结尾有一个关闭的'/'?请注意,第一部分'/ worker.list = /'是一个选择器,那么你有'/ $ /,myvalue /',它有一个所有需要的斜杠,'/ =,/ = /' 。关闭'/'你在找什么? – falstro 2010-07-21 08:23:59

0

你也可以使用awk。将字段分隔符设置为“=”。那么你要追加什么是永远场数2例

$ more file 
worker.list= 
$ awk -F"=" '/worker\.list/{$2=($2=="")? $2="test" : $2",test"}1' OFS="=" file 
worker.list=test 
$ awk -F"=" '/worker\.list/{$2=($2=="")? $2="test" : $2",test"}1' OFS="=" file >temp 
$ mv temp file 
$ awk -F"=" '/worker\.list/{$2=($2=="")? $2="test1" : $2",test1"}1' OFS="=" file 
worker.list=test,test1 

或sed的答案

$ awk -F"=" '/worker\.list/{$2=",test1";sub("=,","=")}1' OFS="=" file