使用Bash替换变量中的字符串

13
我想要在一个变量中替换字符串,例如:
Test=Today, 12:34

我想用之前声明的一个Date变量来替换变量Test中的"Today"。
我尝试使用sed命令:
sed -i -e "s/Today/$Date" '$Test'

但它只会打印出一个错误,并且文件'$Test'是未知的。只能用sed处理文本文件吗?

2
$Test is not a file. You can use: sed '....' <<< "$Test" or better do it in bash itself using "${Test/Today/$Date}" - anubhava
1
除了@anubhava所说的之外,请注意在bash中,变量扩展不会在单引号中起作用。如果您想要扩展Test变量,可以将其保留为未引用的$Test或将其放入双引号中"$Test"。如果您使用单引号,则它将被视为字符串文字。 - antun
当我只写命令"${Test/Today/$Date}"时,它不起作用。我错过了什么? - X3nion
1
这个回答解决了你的问题吗?在Shell脚本中将一个子字符串替换为另一个字符串 - Let's try
3
"${Test/Today/$Date}" 不是一个命令,而是一个产生字符串的表达式。你需要对这个字符串执行一些操作,比如将变量设置为它(Test="${Test/Today/$Date}"会用修改后的值替换当前的 Test 值),打印它(echo "${Test/Today/$Date}"),或者类似的操作。 - Gordon Davisson
3个回答

12
首先,这是一个语法错误。
$: Test=Today, 12:34
bash: 12:34: command not found

给它加上引号。
$: Test="Today, 12:34"
$: Test='Today, 12:34'
$: Test=Today,\ 12:34

然后你可以直接使用 bash 的内置 参数扩展

$: Test='Today, 12:34'
$: Date=12.12.2000
$: Test="${Test/Today/$Date}"
$: echo "$Test"
12.12.2000, 12:34

8
这适用于我:
Test="Today, 12:34"
Date=12.12.2000
sed 's/Today/'"$Date"'/g' <<<"$Test"

编辑:如果您想更改变量Test,就像评论中提到的那样,您需要使用赋值语句:

Test="Today, 12:34"
Date=12.12.2000
Test=$(sed 's/Today/'"$Date"'/g' <<<"$Test")

3
要做到这一点,您不需要使用sed,而是可以利用Bash的一个鲜为人知但非常方便的功能,称为参数扩展,在这里有描述。我只知道这个是因为它在一次工作面试中提到过,面试官与我分享了这个功能,然后让我自己整理思绪...
Test='Today, 12:34'
Date='12.12.2000'
echo "${Test/Today/$Date}"
---
12.12.2000, 12:34

就像我说的那样,这在面试中让我大吃一惊。虽然我没有得到那份工作,但自那以后我几乎每天都在使用这个功能。

1
参数扩展对于更改文件后缀非常有用:for f in *.pdf; do echo "${f/%.pdf/.test}"; done。这将打印每个文件名,将最后一个出现的 ".pdf" 更改为 ".test"。 - Matthias Braun

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