【问题标题】:How to use variables in a command in sed?如何在 sed 的命令中使用变量?
【发布时间】:2013-10-09 17:22:53
【问题描述】:

我有abc.sh:

exec $ROOT/Subsystem/xyz.sh

在 Unix 机器上,如果我打印 echo $HOME,那么我会得到 /HOME/COM/FILE

我想使用 sed 将 $ROOT 替换为 $HOME

预期输出:

exec /HOME/COM/FILE/Subsystem/xyz.sh

我试过了,但没有得到预期的输出:

sed  's/$ROOT/"${HOME}"/g' abc.sh > abc.sh.1

加法:

如果我有abc.sh

exec $ROOT/Subsystem/xyz.sh $ROOT/ystem/xyz1.sh

然后用

sed "s|\$INSTALLROOT/|${INSTALLROOT}|" abc.sh

它只是替换第一个$ROOT,即输出为

exec /HOME/COM/FILE/Subsystem/xyz.sh $ROOT/ystem/xyz1.sh

【问题讨论】:

  • @tripleee 虽然我确信这将与许多其他问题重复,但您指出的问题并不是最好的问题,因为它在变量中不包含斜杠.其中的所有答案都使用/ 作为分隔符。显而易见的东西,我知道,但为更好的(重复)问题留出了空间。

标签: unix sed


【解决方案1】:

说:

sed "s|\$ROOT|${HOME}|" abc.sh

注意:

  • 使用双引号,以便 shell 扩展变量。
  • 使用不同于/ 的分隔符,因为替换包含/
  • 转义模式中的$,因为您不想扩展它。

编辑:为了替换所有出现的$ROOT,比如说

sed "s|\$ROOT|${HOME}|g" abc.sh

【讨论】:

  • 这完全成功了。如果它可以帮助任何人,我做了这样的事情: sed "s|@@ALF_INSTALL_DIR|${ALF_INSTALL_DIR}|g" files/tomcat/alfresco-global.properties.template > files/tomcat/alfresco-global.properties变量包含“/”,因为它有一个路径(fwiw)。
【解决方案2】:

这可能对你有用:

sed 's|$ROOT|'"${HOME}"'|g' abc.sh > abc.sh.1

【讨论】:

  • 谢谢,我必须添加 | sed 's/[{}]//g' 删除括号,但除此之外它有效
【解决方案3】:
This may also can help

input="inputtext"
output="outputtext"
sed "s/$input/${output}/" inputfile > outputfile

【讨论】:

  • 如果输入或输出包含斜杠,这可能会出现问题
  • 我想要一个日期变量,它看起来像 currentDate=$date sed -i '12s|(.*)|

    我的报告

    执行者:我的构建工具

    执行者:$currentDate\1|' > 正如我们所见,sed -i 命令中使用了 currentDate。有没有可能让它发挥作用?

【解决方案4】:

https://www.baeldung.com/linux/sed-substitution-variables 的特殊字符解决方法的保险箱,\ 字符的改进:

#!/bin/bash
to="/foo\\bar#baz"
echo "str %FROM% str" | sed "s#%FROM%#$(echo ${to//\\/\\\\} | sed 's/#/\\#/g')#g"

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2012-06-24
    • 2018-09-16
    • 2022-10-07
    • 1970-01-01
    相关资源
    最近更新 更多