繁体   English   中英

bash通过sed附加到字符串-但不在行尾

[英]bash append to string via sed - but not at the end of the line

我有一个名为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一起使用。

您的代码已经将文本附加到您要修改的变量的上一个值。 假设选项的顺序无关紧要,只需使用已附加到变量后的值来调用脚本。

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的原始值。)

编辑脚本的源代码似乎是很糟糕的做法。 正确的解决方案几乎总是重构脚本以使用参数。 但是您已经这样做了,因此不需要重构-只需使用已经存在的工具即可。

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

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”),则不会创建备份文件。

如果要在以“ export”开头的行的末尾追加,可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM