bash通过sed追加到字符串 - 但不是在行的末尾

时间:2018-02-01 09:31:27

标签: string bash sed replace

我有一个名为foo.sh

的文件

如何编辑/附加以下值:

-Dhttp.proxyHost=<yourProxyHost> -Dhttp.proxyPort=<yourProxyPort>

到包含AMBARI_JVM_ARGS

内容的文件
foo
bar baz
export AMBARI_JVM_ARGS="$AMBARI_JVM_ARGS -Xms512m -Xmx2048m -XX:MaxPermSize=128m -Djava.security.auth.login.config=$ROOT/etc/ambari-server/conf/krb5JAASLogin.conf -Djava.security.krb5.conf=/etc/krb5.conf -Djavax.security.auth.useSubjectCredsOnly=false"
export PATH=$PATH:$ROOT/var/lib/ambari-server
some
more things

以便所需的结果如下:

foo
bar baz
export AMBARI_JVM_ARGS="$AMBARI_JVM_ARGS -Xms512m -Xmx2048m -XX:MaxPermSize=128m -Djava.security.auth.login.config=$ROOT/etc/ambari-server/conf/krb5JAASLogin.conf -Djava.security.krb5.conf=/etc/krb5.conf -Djavax.security.auth.useSubjectCredsOnly=false -Dhttp.proxyHost=<yourProxyHost> -Dhttp.proxyPort=<yourProxyPort>"
export PATH=$PATH:$ROOT/var/lib/ambari-server
some
more things

到目前为止,我无法使用sed。

3 个答案:

答案 0 :(得分:1)

您的代码已将文本附加到您尝试修改的变量的上一个值。假设选项的顺序不重要,只需使用已附加到变量的值调用脚本。

AMBARI_JVM_ARGS="$AMBARI_JVM_ARGS -Dhttp.proxyHost=<yourProxyHost> -Dhttp.proxyPort=<yourProxyPort>" ./foo.sh

(结果很长,所以这里是一个缩短的伪代码版本,以便易读:

var="$var with new value appended" ./foo.sh

即。使用包含前一个值和后缀的值覆盖var的值,并在命令持续时间内使用此临时值运行脚本。 shell命令var=value commandvar设置为value,运行command,并恢复原始值var。)

编辑脚本的来源似乎很糟糕。正确的解决方案几乎总是重构脚本以取代参数。但是你已经这样做了,所以不需要重构 - 只需使用已经存在的设施。

答案 1 :(得分:1)

您需要更换正则表达式,如下所示:

sed -ri.bak 's/^(export AMBARI_JVM_ARGS=.*)"$/\1 -Dhttp.proxyHost=<yourProxyHost> -Dhttp.proxyPort=<yourProxyPort>"/g' foo.sh

'-r'启用正则表达式扩展。 '-i'表示“就地编辑”,这是您需要的:更改文件。如果指定'.bak',sed创建'foo.sh.bak'以在更改之前保存文件,您可以忽略'.bak'(但保留'-i'),然后不会创建备份文件。

答案 2 :(得分:0)

如果你想在以&#34; export&#34;开头的行末尾追加,你可以这样做:

sed -i -E "s/export\(.*\)$/export\1<TEXT_TO_APPEND>/" AMBARI_JVM_ARGS
相关问题