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


标题说明了所有。我需要将我不知道的属性值替换为不同的值。 我正在尝试这个:

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

我明白了 sed: -e expression #1, char 19: unknown option tos'`

我认为问题是这样的 $newvalue 是一个代表一个目录的字符串,所以它搞砸了sed。

我能做什么 ?


11714
2017-12-22 16:42


起源

/ 只是通常的(但不是强制性的)分隔符 sed。如果你尝试别的东西会发生什么,比如管道(|)? - Dan Fego
@DanFego工作了!我花了很长时间才意识到这一点 / 在我的var字符串中是问题。忘了你可以切换sed分隔符。谢谢 - Michael
你为什么用这个 g 修饰符呢? - fge


答案:


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


7
2017-12-22 16:52



对于某些seds,你需要“逃避”非标准reg-ex分隔符的第一个实例,比如's \ | srch | repl |'。祝你们好运。 - shellter


如果您的属性文件是以分隔符分隔的 = 像这样的标志 -

param1=value1
param2=value2
param3=value3

那你可以用 awk 做修改 参数价值 只知道了 参数名称。例如,如果我们想修改 param2 在您的属性文件中,我们可以执行以下操作 -

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

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

在这种情况下,您可以执行以下操作 -

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

在此我们创建了一个 awk 变量 newval 并使用包含新参数值的脚本变量($ var)对其进行初始化。


7
2017-12-22 18:44



如果我想在最后添加新行,如果该属性不存在怎么办? - Luan Nico
我试过了 awk 命令说明但它剥离了 = 超出输出,所以最终转换 HOSTNAME=oldvalue 至 HOSTNAME newvalue  - 知道我错了什么吗? - Oliver Dungey
@Oly你需要设置OFS变量。所以 awk -F'=' -v OFS='=' ... - jaypal singh
谢谢@jaypalsingh我发现了OFS字段的这个很好的小描述: thegeekstuff.com/2010/01/... - Oliver Dungey
awk:newval1 =测试:8080 / testservices awk:^语法错误我收到语法错误:任何帮助将非常感激。 - Milind D


我从名叫Kongchen的人那里找到了一个函数。他编写了一个函数脚本来更改属性值,它对我来说很好:

一探究竟: https://gist.github.com/kongchen/6748525


0
2018-02-15 09:36