如何在sed命令中使用bash脚本变量

17

我执行了以下的bash脚本:

#!/bin/bash
version=$1
echo $version
sed 's/\${version.number}/$version/' template.txt > readme.txt

我希望用变量“version”中的内容替换所有${version.number}的实例,但实际上插入了文本$version。

我需要怎么做才能让sed使用当前$version的值?

3个回答

22
sed "s/\${version.number}/$version/" template.txt > readme.txt

只有双引号才会替换美元符号。这也意味着单引号不需要转义美元符号。


但美元符号必须被转义,因为sed将表达式视为正则表达式。所以我认为应该是 \\$ - Philipp
1
@Philipp,实际上$符号只有在正则表达式的最后一个字符(或子表达式)时才是锚点。但我承认我很幸运。 ;) 你可以选择添加转义斜杠,但这时就是\\\$ - Matthew Flaschen
这个对我来说效果更好。 - Wok

4
您也可以简单地取消引用变量。
sed 's/'${version.number}'/'$version'/' template.txt > readme.txt

0

这可能有点老了,但仍然可能有所帮助... 对我来说,像Philip所说的那样使用双重转义(如果您使用括号,请转义括号...)可以解决问题:

#!/bin/bash
LIVE_DB_NAME='wordpress';
STAGING='staging';
sed -r "s/define\('DB_NAME', '[a-zA-Z0-9]+'\);/define('DB_NAME', '\\${LIVE_DB_NAME}');/" ${STAGING}/wp-config.php >tmp1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接