sed替换了第一个匹配项上的所有行,不起作用

时间:2019-02-26 05:32:36

标签: sed command-line text-processing

这是我要编辑的文件

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

我想将包含“侦听”的第一行更改为新词,例如“ 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代码有什么问题,为什么即使它不匹配我的模式,它仍替换第一行?

1 个答案:

答案 0 :(得分:0)

尝试:

$ 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匹配的第一行的所有行。因此,这与示例文件的前 2 行匹配。

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

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