如何在 sed 的命令中使用变量?

Posted

技术标签:

【中文标题】如何在 sed 的命令中使用变量?【英文标题】:How to use variables in a command in 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

【问题讨论】:

replace a string in shell script的可能重复 @tripleee 虽然我确信这将与许多其他问题重复,但您指出的问题并不是最好的问题,因为它在变量中不包含斜杠.其中的所有答案都使用/ 作为分隔符。显而易见的东西,我知道,但为更好的(重复)问题留出了空间。 【参考方案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"

【讨论】:

以上是关于如何在 sed 的命令中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sed 命令中使用变量来替换属性文件中的属性值

shell脚本sed命令如何使用变量替换掉包含指定字符串的整行

如何使用 sed 或 awk 命令用变量(变量保存 Unix 脚本)查找和替换文本

如何通过 sed 命令将变量传递给 .conf 文件

如何使用sed在文件中确定行插入带有变量的字符串

sed修炼系列:sed中的疑难杂症