首页 > 解决方案 > sed 替换第一场比赛中的所有行不起作用

问题描述

这是我要编辑的文件

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 代码有什么问题,为什么它会替换第一行,即使它与我的模式不匹配?

标签: sedcommand-linetext-processing

解决方案


尝试:

$ 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;/替代命令。它对范围内的任何行执行。它将任何行 ( .*)替换为listen_xyz 40;. 这意味着它取代server {listen 99;.

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


推荐阅读