【问题标题】:sed append line on 1 occurrence onlysed 仅在 1 次出现时追加行
【发布时间】:2013-03-25 20:25:40
【问题描述】:

有这个文件

ServerName *
ServerAlias *
ServerAlias *

<Directory>

我想在第一次出现 ServerAlias 之后添加一个带有文本 S2 的新行。 我已经尝试了以下

sed '/ServerAlias/ a\S2\' foo

但这是在所有出现之后追加的。

我的最终结果应该是

ServerName *
ServerAlias *
S2
ServerAlias *

<Directory>

【问题讨论】:

    标签: sed


    【解决方案1】:

    其实不是sed,但也许awk可以帮到你。

    $> cat ./file
    ServerName *
    ServerAlias *
    ServerAlias *
    
    <Directory>
    
    $> awk '{print} /^ServerAlias/ && !n {print "S2"; n++}' ./file
    ServerName *
    ServerAlias *
    S2
    ServerAlias *
    
    <Directory>
    

    UPD:错误现已修复,感谢 glenn_jackman

    【讨论】:

    • 您可能需要锚定正则表达式以避免匹配 cmets 中的“ServerAlias”。
    • 为避免两次打印匹配的行,请使用:awk '{print} /^ServerAlias/ &amp;&amp; !n {print "S2"; n++}' file
    • 已修复。感谢您的精彩观察。
    【解决方案2】:

    上面的 awk 解决方案是最好的,但是如果你真的想在 (GNU) sed 中这样做,那么下面的方法就可以了:

    sed '0,/^ServerAlias.\+/s//\0\nS2/' file
    

    归功于the sed FAQ

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多