1

我可以像这样使用 tcsh 中的 sed:

set a = `echo $a | sed -e 's_old_new_'`

一切都很好,但是当我想这样做时:

set a = `echo $a | sed -e 's_old_*new_'`

我可以看到“设置:不匹配”。. 我怎样才能逃离这颗星星?

4

2 回答 2

3

我对 tcsh 了解不多,但很少有实验表明分配变量的集合尝试扩展右侧 *. 这可能会有所帮助:

set a="`echo '2e2' | sed -e 's_e_*_'`"
echo "$a"
2*2
echo $a
echo: No match.

所以在反引号周围加双引号,它会起作用。

set a = "`echo $a | sed -e 's_old_new_'`"
于 2012-10-27T23:09:22.890 回答
0

未包含在双引号中的命令替换(`$(..))受文件名扩展(又名“通配符”)和分词的影响。

通常,变量赋值会抑制 RHS 的文件名扩展和分词(即使没有双引号),但在命令替换的情况下显然不会文件名扩展。

这是我为参考目的而运行的测试:

$ touch randomfile
$ a="*file"
$ var_expand=$a
$ echo "$var_expand"
*file
$
$ cmd_subst=$(echo '*file')
$ echo "$cmd_subst"
randomfile

所以我想当你分配给变量时总是双引号命令替换是一个好习惯。

safe="$(cmd)"

注意:这是在 Bash 中测试的,但我认为 tcsh 在这方面表现出类似的行为。

于 2012-11-04T11:12:15.773 回答