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

问题描述 投票:0回答:1

这是我想要编辑的文件

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 command-line text-processing
1个回答
0
投票

尝试:

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

Explanation

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.