我知道这个问题之前有人问过,但我很难确定我的脚本错误的根本原因。我已经看过其他问题并尝试转换它(将 /\ 换成 @),但它对我来说不起作用,我仍然收到相同的错误???
当我添加最后 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
希望有帮助