我遇到了这个bash脚本,我想知道sed -i在做什么,/s和/g是怎么回事?我查看了手册,它说文本sed用于转换文本,i标志用于在适当的位置进行转换。但是,在这个脚本的背景下,什么正在被转换,它正在被转化为什么?
#!/bin/sh
sed -i "s/$SENTINEL_QUORUM/$SENTINEL_QUORUM/g" /redis/sentinel.conf
sed -i "s/$SENTINEL_DOWN_AFTER/$SENTINEL_DOWN_AFTER/g" /redis/sentinel.conf
sed -i "s/$SENTINEL_FAILOVER/$SENTINEL_FAILOVER/g" /redis/sentinel.conf
redis-server /redis/sentinel.conf --sentinel这是sentinel.conf,如果有帮助的话:
port 26379
dir /tmp
sentinel monitor redismaster redis-master 6379 $SENTINEL_QUORUM
sentinel down-after-milliseconds redismaster $SENTINEL_DOWN_AFTER
sentinel parallel-syncs redismaster 1
sentinel failover-timeout redismaster $SENTINEL_FAILOVER发布于 2022-11-08 19:02:11
除非shell变量的值中有特殊的regexp模式,否则它不会做任何事情,因为它将变量的值替换为它们自己。他们可能想要的是:
sed -i 's/\$SENTINEL_QUORUM/'"$SENTINEL_QUORUM/g" /redis/sentinel.conf其他变量也是一样的。
正在替换的模式是单引号,因此变量不会展开。我们避开了$,所以它不会被看作是行尾的regexp模式。
替换为双引号,因此变量值将被替换。
发布于 2022-11-08 19:01:03
这些都是无济于事的。
假设bash变量设置如下:
SENTINEL_QUORUM=some_value然后,当前调用变成:
sed -i "s/some_value/some_value/g" /redis/sentinel.conf而且,由于文件中没有字符串some_value,所以没有任何更改。
注意:,即使文件中有一个字符串some_value,这个sed也会用相同的值覆盖字符串(即更改some_value = some_value)。
相反,它的意图似乎是将文件中的占位符(例如,$SENTINEL_QUORUM)替换为bash变量($SENTINEL_QUORUM)的内容。
但要做到这一点,必须转义第一个$,以便sed与文件中的文本$匹配,例如:
# change this:
sed -i "s/$SENTINEL_QUORUM/$SENTINEL_QUORUM/g" /redis/sentinel.conf
^
# to this:
sed -i "s/\$SENTINEL_QUORUM/$SENTINEL_QUORUM/g" /redis/sentinel.conf
^^当然,在第一次运行后,文件的内容将被更改,并且剽窃者(例如,$SENTINEL_QUORUM)将消失,所以下一次脚本运行时什么都不会改变。
发布于 2022-11-08 19:05:20
-i选项用于直接更改文件。否则,您必须重定向到New file,然后使用mv命令将新文件重命名为旧文件名。
S用于搜索某种模式。在您的示例中,e.g.$SENTINEL_QUORUM并将其替换为在next /g之后可以找到的内容,用于替换找到的每个模式,而不仅仅是一个模式。
例如,在vi中,可以通过编写以下内容使用相同的方法:
:s/searchfor/replacewith/g顺便说一句,在你的情况下,搜索和替换是一样的,这没有什么意义。
https://stackoverflow.com/questions/74365794
复制相似问题