【问题标题】:Problem inserting on first match only using GNU sed仅使用 GNU sed 在第一次匹配时插入问题
【发布时间】:2019-08-10 23:17:39
【问题描述】:

4 在我的 linux 机器上(我检查了 sed --version)。

目前,我有一个myfile.txt,内容如下:

---
title: hello
author: Jan King
foo: bar
author: Jan King
---

我知道在 GNU sed 中,如果我在 sed 命令前面加上 0,,我可以在第一次匹配后追加。

所以,如果我想在--- 第一次出现之后插入goodbye,我可以这样做:

 sed -i '0,/---/a goodbye' myfile.txt

预期/正确结果:

---
goodbye
title: hello
author: Jan King
foo: bar
author: Jan King
---

但现在,我尝试在第一次出现 author: Jan King 之后插入 goodbye

但是,下面的sed 命令不起作用并追加goodbye 3 次,这不是我想要的:

 sed -i '0,/^author:.*/a goodbye' myfile.txt

不正确/意外的结果:

---
goodbye
title: hello
goodbye
author: Jan King
goodbye
foo: bar
author: Jan King
---

如果我从上述 sed 命令中删除 0,,则 goodbyeauthor: Jan King 之后附加两次:

 sed -i '/^author:.*/a goodbye' myfile.txt

预期结果:

---
title: hello
author: Jan King
goodbye
foo: bar
author: Jan King
goodbye
---

所以我无法在author: Jan King 的第一场比赛中附加goodbye(即使--- 的第一场比赛很好)。

谁能解释为什么我的sed 命令不起作用?以及如何解决?

【问题讨论】:

标签: linux bash sed


【解决方案1】:

您在评论中显示的链接与您尝试使用的命令序列不完全相同。如果您想使用相同的技术,请尝试:

sed -i '0,/^\(author:.*\)/s//\1\nNew Inserted Line/' myfile.txt

【讨论】:

    【解决方案2】:

    你需要用到两个条件:

    1. 行的范围0,/^author:/
    2. 此范围内的特定行/^author:/

    你可以这样写:

    sed -i '0,/^author:/{/^author:/a goodbye
    }' file
    

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed -i -e '/^author:/{a goodbye' -e ':a;n;ba}' file
      

      关注包含author: 的第一行,然后附加goodbye 并循环遍历所有剩余的行。

      【讨论】:

        猜你喜欢
        • 2012-04-15
        • 2018-11-24
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-30
        • 2017-02-10
        • 2013-03-11
        相关资源
        最近更新 更多