【问题标题】:bash append to string via sed - but not at the end of the linebash 通过 sed 附加到字符串 - 但不在行尾
【发布时间】:2018-07-11 13:54:57
【问题描述】:

我有一个名为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 设置为您想要包含的值即可调用它。
  • 好点所以直接设置环境变量可能会更好

标签: string bash sed replace


【解决方案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 command设置varvalue,运行command,恢复var的原始值。)

编辑脚本的源代码似乎是非常糟糕的做法。正确的解决方案几乎总是将脚本重构为采用参数。但是你的已经这样做了,所以不需要重构——只需使用已经存在的工具。

【讨论】:

    【解决方案2】:

    你需要正则表达式替换,像这样:

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

    【讨论】:

      【解决方案3】:

      如果你想在以“export”开头的行的末尾追加,你可以这样做:

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

      【讨论】:

      • 这会改变任何export(并假设AMBARI_JVM_ARGS 是文件的名称,而不是要修改的变量的名称)所以并不是OP 真正要求的。
      • @tripleee mmm 那么我不确定 OP 在寻找什么。
      猜你喜欢
      • 1970-01-01
      • 2017-11-04
      • 2021-09-17
      • 2017-02-18
      • 2017-02-13
      • 2015-11-27
      • 2016-09-10
      • 2018-06-20
      • 2021-04-18
      相关资源
      最近更新 更多