sed 正则表达式匹配后跳过行

skip lines after sed regular expression match

我正在尝试使用 sed 编辑 aws elasticbeanstalk nginx 配置文件。我想在默认位置块之后插入一个新位置块。

为此,我匹配了前一个位置块中的一行,然后我想跳过 8 行,然后插入文本。

这是我运行 sed 之前的样子

upstream nodejs {
    server 127.0.0.1:8081;
    keepalive 256;
}

server {
    listen 8080;

    location / {
        proxy_pass  http://nodejs;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

这是我天真的尝试构建实际上不起作用的命令,而是将新块粘贴在包含 proxy_pass http://nodejs;.

的行下
sed -i '/nodejs;/a \ location ^~ /blog {}' /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf

如何在 regex 中识别的行后跳过 8 行。另外,我也很欣赏关于确定我要放置新块的位置的另一种方法的建议。

这将查找 nodejs; 并向下跳转八行,然后插入 location ^~ /blog {}。您尚未显示所需的输出,但根据问题,我推断这就是您要寻找的内容:

$ sed '/nodejs;/ {n;n;n;n;n;n;n;n;s/^/    location ^~ \/blog {}\n/}' file
upstream nodejs {
    server 127.0.0.1:8081;
    keepalive 256;
}

server {
    listen 8080;

    location / {
        proxy_pass  http://nodejs;
        proxy_set_header   Connection "";
        proxy_http_version 1.1;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location ^~ /blog {}
}

工作原理

sed 命令是:

/nodejs;/ {n;n;n;n;n;n;n;n;s/^/ location ^~ \/blog {}\n/}

首先查找包含 nodejs; 的行,找到后执行大括号中的语句。

n 打印当前模式 space 并读入下一行。我们这样做八次。这样就有跳下八行的效果了

s/^/ location ^~ \/blog {}\n/ 在第八行进行更改。