sed 命令返回“sed:替换表达式中的错误选项”

sed 命令返回“sed:替换表达式中的错误选项”

例如:- 我有一个名为 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

相关内容