首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed在这个bash脚本中做什么?

sed在这个bash脚本中做什么?
EN

Stack Overflow用户
提问于 2022-11-08 18:51:18
回答 4查看 46关注 0票数 -1

我遇到了这个bash脚本,我想知道sed -i在做什么,/s/g是怎么回事?我查看了手册,它说文本sed用于转换文本,i标志用于在适当的位置进行转换。但是,在这个脚本的背景下,什么正在被转换,它正在被转化为什么?

代码语言:javascript
复制
#!/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,如果有帮助的话:

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

发布于 2022-11-08 19:02:11

除非shell变量的值中有特殊的regexp模式,否则它不会做任何事情,因为它将变量的值替换为它们自己。他们可能想要的是:

代码语言:javascript
复制
sed -i 's/\$SENTINEL_QUORUM/'"$SENTINEL_QUORUM/g" /redis/sentinel.conf

其他变量也是一样的。

正在替换的模式是单引号,因此变量不会展开。我们避开了$,所以它不会被看作是行尾的regexp模式。

替换为双引号,因此变量值将被替换。

票数 1
EN

Stack Overflow用户

发布于 2022-11-08 19:01:03

这些都是无济于事的。

假设bash变量设置如下:

代码语言:javascript
复制
SENTINEL_QUORUM=some_value

然后,当前调用变成:

代码语言:javascript
复制
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与文件中的文本$匹配,例如:

代码语言:javascript
复制
# 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)将消失,所以下一次脚本运行时什么都不会改变。

票数 0
EN

Stack Overflow用户

发布于 2022-11-08 19:05:20

-i选项用于直接更改文件。否则,您必须重定向到New file,然后使用mv命令将新文件重命名为旧文件名。

S用于搜索某种模式。在您的示例中,e.g.$SENTINEL_QUORUM并将其替换为在next /g之后可以找到的内容,用于替换找到的每个模式,而不仅仅是一个模式。

例如,在vi中,可以通过编写以下内容使用相同的方法:

代码语言:javascript
复制
:s/searchfor/replacewith/g

顺便说一句,在你的情况下,搜索和替换是一样的,这没有什么意义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74365794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档