String 用包含特殊字符的字符串替换文件中的短语

String 用包含特殊字符的字符串替换文件中的短语,string,shell,unix,sed,String,Shell,Unix,Sed,我正在使用sed-e“s/foo/$bar/”-e“s/some/$text/”文件来替换某个文件中的短语。问题是$bar字符串包含多个特殊字符,如/。因此,当我尝试使用以下代码替换文本文件中的某些内容时 #!/bin/bash bar="http://stackoverflow.com/" sed -e "s/foo/$bar/" -e "s/some/$text/ file.whatever …然后我得到一个错误,提示:sed:s的未知选项我能做些什么吗?您可以使用任何分隔符s@som

我正在使用
sed-e“s/foo/$bar/”-e“s/some/$text/”文件来替换某个文件中的短语。问题是$bar字符串包含多个特殊字符,如
/
。因此,当我尝试使用以下代码替换文本文件中的某些内容时

#!/bin/bash

bar="http://stackoverflow.com/"

sed -e "s/foo/$bar/" -e "s/some/$text/ file.whatever

…然后我得到一个错误,提示:
sed:s的未知选项
我能做些什么吗?

您可以使用任何分隔符<代码>s@some@例如,一些@
。另一个好的分隔符是竖线。其他字符可以工作,但对于某些上下文(如正则表达式)具有特殊意义。

无论使用什么分隔符,在sed中都会遇到这种困难,尤其是在不知道字符串包含什么的情况下。我会选择一种不同的方法将shell变量传递到helper解释器

awk -v rep1="$bar" -v rep2="$text" '{sub(/foo/, rep1); sub(/some/, rep2); print}'

在这种情况下,正确胜过简洁。

()

只是吹毛求疵,
^
是一个regex元字符,所以最好选择
|
@
perl -spe 's/foo/$rep1/; s/some/$rep2/' -- -rep1="$bar" -rep2="$text"