使用 sed 替换包含特定位置任何字符的字符串

使用 sed 替换包含特定位置任何字符的字符串

我有一个文件 nginx.conf 如下

load_module /usr/lib/nginx/modules/ngx_stream_module.so;
worker_processes  1;

events {
  worker_connections  1024;
}

stream {

  upstream redis {
    server 34.73.56.224:6379;
  }

  server {
    listen 8888 so_keepalive=on;
    proxy_pass redis;
  }
}

我正在尝试编写一个脚本,以便当我运行时bash swap.sh 400,当前所在的地址34.73.56.224将被替换为400;然而,它不会一直是这个数字——它可能会说一个不同的地址,或者它可能会说redis。注意::6379运行脚本后应该仍然存在。这是我现在所拥有的:

#!/usr/bin/env bash
PARAM=$1

sed -i'.conf' "s/server .+:/server $PARAM:/" nginx.conf

但是,这不起作用,我认为这是因为我没有正确使用正则表达式命令。有人能指出我正确的方向吗?

答案1

尝试:

sed -E -i'.conf' "s/server .+:/server $PARAM:/" nginx.conf

默认情况下,sed 使用基本正则表达式(布雷)。在 BRE 中,a+是字面上的加号。因此,.+匹配任何.后跟加号的字符 ( )。

你想要一些不同的东西:你想要.+匹配一个或多个任何字符,其中.匹配任何字符并+指示一个或多个。为了得到这个,你需要扩展正则表达式(ERE)。 -E告诉 sed 使用 ERE。

相关内容