让 sed 通过 2 行或更多行(本例中为所有行)工作,而不是仅一行

让 sed 通过 2 行或更多行(本例中为所有行)工作,而不是仅一行

我将 Ubuntu 16.04 与 Bash 结合使用,我应该为 Nginx 环境中的特定网站启用 http2。


本质上,该实用程序sed对第​​一个相关行中的第一个实例进行文本处理(使用g参数将使其处理第一个相关行上的所有实例),但我希望对2 行或更多行(实际上所有行)。

我看了一下man sed并发现了一个-l参数,可以让您指定要使用的行数(如果我理解正确的话),但我希望在所有行上工作,而不依赖于特定的行数。

我遇到的特殊情况是我尝试将这两个sed操作统一为一个:

s_a="/etc/nginx/sites-available/"
$domain="example.com"
sed -i "s/listen 443 ssl default_server;/listen 443 ssl http2 default_server;/" $s_a/$domain.conf
sed -i "s/listen [::]:443 ssl default_server;/listen [::]:443 ssl http2 default_server;/" $s_a/$domain.conf

我可以将这两个sed操作统一为:

sed -i "s/443 ssl default_server/443 ssl http2 default_server/" $s_a/$domain.conf

我认为确保在如此方便的一行操作中覆盖所有相关行的最安全方法是使用一些参数,但我不知道这是否可以通过参数来完成(-l如果有的话),或者我必须使用正则表达式。

答案1

这里似乎有一个错误,因为:

sed -i "s/443 ssl default_server/443 ssl http2 default_server/" $s_a/$domain.conf

会工作得很好;它将用“443 ssl http2 default_server”替换$s_a/$domain.conf.

-l仅与l命令相关。

sed处理所有行,除非您告诉它不要这样做,例如提前退出。命令g的选项仅s影响多次出现的搜索词的处理方式每行:如果没有g,则仅替换任何给定行上的第一个匹配项,而使用g,则替换所有匹配项。在这两种情况下,替换都会应用于所有行。

相关内容