例如:- 我有一个名为 file.txt 的文件
$ cat file.txt
$key
我有一个环境变量,例如:文本文件中的 $key
假设 $key = 1234,那么我可以用下面的命令替换该值
sed -i 's/$key/'"$key"'/' file.txt
然后就变成了
$ cat file.txt
1234
我的问题是,如果
$key = 1/2/3/4
我无法运行以下命令
sed -i 's/$key/'"$key"'/' file.txt
它会给出一个错误
sed: bad option in substitution expression
因为斜线,它坏了。我可以通过直接给出值来解决这个问题,但我不想那样使用它。
sed -i 's/$key/1\/2\/3\/4/' file.txt
答案1
问题在于sed
分隔符是/
,并且它与 中的文本相冲突$key
。要解决此问题,请使用其他分隔符。例如#
:
$ key="1/2/3/4"
$ echo 1/2/3/4 | sed "s#$key#\"$key\"#"
"1/2/3/4"
或者
$ echo "hello this is 1/2/3/4 yeah" | sed "s#$key#\"$key\"#"
hello this is "1/2/3/4" yeah
有趣的阅读:在 sed 中可以使用哪些分隔符?.剧透:几乎所有事情!
答案2
Perl 来救援:
perl -pe 's/\$([[:alnum:]]+)/$ENV{$1}/'
解释:
\$
与美元符号匹配。[[:alnum:]]
匹配数字、字母和下划线,即有效的标识符字符。意味着+
必须至少有一个这样的字符。(...)
引入一个捕获组。$ENV{$1}
从包含环境变量的哈希中检索值%ENV
。Perl 不会像 shell 那样扩展变量,因此变量可以包含/
(或其他任何内容)而不会造成损害。
例子:
$ echo '$key' | key=1/2/3/4 perl -pe 's/\$([[:alnum:]]*)/$ENV{$1}/'
1/2/3/4