sed:-e 表达式对“s”的未知选项

sed:-e 表达式对“s”的未知选项

我知道这个问题之前有人问过,但我很难确定我的脚本错误的根本原因。我已经看过其他问题并尝试转换它(将 /\ 换成 @),但它对我来说不起作用,我仍然收到相同的错误???

当我添加最后 4 个(从底部开始)表达式时,我开始收到错误,...

当我运行这个

clustername="'XXXCluster'"  
seed=xx.xxx.xxx.xx  
ip=xx.xxx.xxx.xx  
hint="/opt/cassandra/data/hints"  
data="/opt/cassandra/data/data"  
commitlog="/opt/cassandra/data/commitlog"  
cache="/opt/cassandra/data/saved_caches"  

sed -i -e "s/\(cluster_name:\).*/\1$clustername/" \  
-e "s/\(- seeds:\).*/\1$seed/" \  
-e "s/\(listen_address:\).*/\1$ip/" \  
-e "s/\(rpc_address:\).*/\1$ip/" \  
-e "s/\(broadcast_rpc_address:\).*/\1$ip/" \  
-e "s/\(hints_directory:\).*/\1$hint/" \  
-e "s/\(data_file_directory:\).*/\1$data/" \  
-e "s/\(commitlog_directory:\).*/\1$commitlog/" \  
-e "s/\(saved_caches_directory:\).*/\1$cache/" /opt/cassandra.yaml  

我得到这个 sed: -e 表达式 #6, char 29: 未知选项为 `s'

但我不知道如何解决这个问题,有人可以帮帮我吗?

提前致谢..

答案1

在 sed 中使用 % 代替 /。

sed -e 's%search_string%replace_with%'

我猜你的问题行中有斜线,sed 会很难处理它。

编辑:

由于您使用变量来替换字符串,因此其中的斜线很重要。

我的第一个回答有点误导。抱歉。

例子:

我们有一个文件 nada.txt,内容为 'test: "/a/place/in/universe"'

$ cat nada.txt
test: "/a/place/in/universe"

带有用于替换的目录的变量

$ dir="/new/place/in/haven"
$ echo $dir
/new/place/in/haven

让我们尝试失败

$ sed -e "s/\(test: \).*/\1$dir/" nada.txt
sed: -e expression #1, char 19: unknown option to `s'

再次,但这次用 % 替换斜线(“s///” 替换为“s%%%”)

$ sed -e "s%\(test: \).*%\1$dir%" nada.txt
test: /new/place/in/haven

或者

$ sed -e 's%\(test: \).*%\1'$dir'%' nada.txt
test: /new/place/in/haven

看到单引号,你需要四个才能取出变量。它看起来像这样 's%%'$dir'%' 因为在 shell 上下文中单引号不会解析变量:

$ echo 'Such a text and $dir'
Such a text and $dir

双引号可以按预期完成工作。

$ echo "Such a text and $dir"
Such a text and /new/place/in/haven 

希望有帮助

相关内容