从shell脚本编辑属性文件中的属性值

问题描述:

标题说明了所有。我需要将我不知道的财产价值换成不同的价值。 我想要这样的:从shell脚本编辑属性文件中的属性值

#!/bin/bash 
sed -i "s/myprop=[^ ]*/myprop=$newvalue/g" file.properties 

我得到sed: -e expression #1, char 19: unknown option to s'`

我认为这个问题是$newvalue是代表一个目录,以便它搅乱了sed的字符串。

我该怎么办?

+3

'/'只是为了'sed'通常(但不是强制性的)分隔符。如果你尝试别的东西,会发生什么,比如pipe('|')? – 2011-12-22 16:45:44

+0

@DanFego工作!我花了很长时间才意识到我的var字符串中的'/'是问题所在。忘了你可以切换sed分隔符。谢谢 – Michael 2011-12-22 16:50:03

+1

为什么你根本用“g”修饰符? – fge 2011-12-22 16:51:29

sed可以使用除/以外的字符作为分隔符,尽管/是最常见的。在处理诸如路径名之类的东西时,使用诸如管道(|)之类的东西通常会很有帮助。

+0

对于某些seds,您需要'逃避'非标准reg-ex分隔符的第一个实例,如's \ | srch | repl |'。祝你们好运。 – shellter 2011-12-22 17:18:21

如果你的属性文件的分隔与=签这样的 -

param1=value1 
param2=value2 
param3=value3 

那么你可以使用awk确实因刚知道PARAM名 modifiy的参数值的方式。举例来说,如果我们要修改的param2在你的属性文件,我们可以做如下 -

awk -F"=" '/param2/{$2="new value";print;next}1' filename > newfile 

现在,上面one-liner需要你硬编码参数的时新的价值。如果您在shell脚本中使用它,并且需要从变量中获取新值,则情况可能不是这种情况。

在这种情况下,你可以做以下 -

awk -F"=" -v newval="$var" '/param2/{$2=newval;print;next}1' filename > newfile 

在此,我们创建一个awk变量newval,并与您的脚本变量($ VAR),其中包含新的参数值初始化。

+0

如果我想在结尾添加新行(如果该属性不存在)该怎么办? – 2015-08-04 13:33:42

+0

我试过'awk'命令,但它从输出中去掉'=',所以最终将'HOSTNAME = oldvalue'转换为'HOSTNAME newvalue' - 任何想法我错了什么? – 2016-05-20 11:46:59

+1

@Oly您需要设置OFS变量。所以'awk -F'='-v OFS ='='...' – 2016-05-20 13:08:58

我从名为Kongchen的人发现了一个函数。他写了一个函数脚本来更改属性值,它为我工作得很好:

检查出来: https://gist.github.com/kongchen/6748525