【问题标题】:sed to replace all line on the first match not workingsed 替换第一个匹配项上的所有行不起作用
【发布时间】:2019-02-26 13:40:24
【问题描述】:

这是我要编辑的文件

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】:

    试试:

    $ 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 的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2012-02-27
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      相关资源
      最近更新 更多