sed 替换第一场比赛中的所有行不起作用

sed to replace all line on the first match not working

这是我要编辑的文件

server {    
listen      99;
listen      200;
listen      300;
server_name xxxx;
root        xxxx;
...

我想将包含 'listen' 的第一行更改为像“listen_xyz 40;”这样的新词,这是我的代码:

sed -i -e '0,/listen/s/.*/listen_xyz 40;/' file

为什么它也替换了第一行(与模式不匹配),所以我的文件现在看起来像这样:

listen_xyz 40;
listen_xyz 40;
listen      200;
listen      300;
server_name xxxx;
root        xxxx;
...

我的 sed 代码有什么问题,为什么它替换了第一行,即使它与我的模式不匹配?

尝试:

$ sed -e '0,/listen/ s/listen.*/listen_xyz 40;/' file
server {    
listen_xyz 40;
listen      200;
listen      300;
server_name xxxx;
root        xxxx;
...

说明

0,/listen/是一个范围。它匹配从文件开头到匹配正则表达式 listen 的第一行的所有行。因此,这与示例文件的前 行匹配。

s/.*/listen_xyz 40;/ 是一个 substitute 命令。它针对范围内的任何行执行。它用 listen_xyz 40; 替换任何行 (.*)。这意味着它取代了 server { 以及 listen 99;.

通过将替换命令更改为 s/listen.*/listen_xyz 40;/,我们确保它只替换包含 listen.

的行