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


0

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

Answers:


5

问题与这个问题有关 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中使用哪些分隔符? 。剧透:几乎应有尽有!


问题是当您不知道变量将包含哪些字符时。
choroba

1

Perl救援:

perl -pe 's/\$([[:alnum:]]+)/$ENV{$1}/'

说明:

  • \$ 匹配美元符号。
  • [[:alnum:]] 匹配数字,字母和下划线,即有效的标识符字符。该 + 意味着必须至少有一个这样的角色。
  • (...) 介绍一个捕获组。
  • $ENV{$1} 从中检索值 %ENV hash包含环境变量。 Perl不会像shell那样扩展变量,因此变量可以包含 / (或其他任何)没有伤害。

例:

$ echo '$key' | key=1/2/3/4 perl -pe 's/\$([[:alnum:]]*)/$ENV{$1}/'
1/2/3/4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.