【问题标题】:Find a matching text and replace next two lines in unix在 unix 中查找匹配的文本并替换下两行
【发布时间】:2020-07-25 07:45:30
【问题描述】:

我有一个这样的文件

aaa
bbb
ccc
ddd
eee

我想找到 bbb 并将接下来的 2 行替换为 zzz。最终结果应该是

aaa
bbb
zzz
zzz
eee

我试过 sed,我可以做一行。不知道如何做 2 行。 请帮忙。 提前致谢

【问题讨论】:

  • bbb后面的两行也可以包含bbb吗?
  • 没有。只有一次
  • 如果 bbb 出现多次,如何实现?
  • 我建议用相应的例子开始一个新问题。
  • @PrasadJayathilake 这两个答案都替换了每次出现的bbb

标签: unix sed find


【解决方案1】:

使用 GNU sed:

sed '/bbb/,+2{ /bbb/b; s/.*/zzz/ }' file

使用 awk:

awk '/bbb/{print; getline; print "zzz"; getline; print "zzz"; next}1' file

【讨论】:

    【解决方案2】:

    您可以选择 sed 或 awk:

    sed '/bbb/{n;N;s|.*|zzz\
    zzz|}' file
    
    awk 'flag{print "zzz";flag--;next};/bbb/{flag=2};1' file
    

    如果您使用 sed,请确保不要将单引号更改为双引号。

    【讨论】:

    • sed - 替换了两行,但这些行显示为 zzzzzz。 -aaa -bbb -zzzzzz -eee。 Grep 解决方案效果很好
    • 如果bbb出现多次怎么办?
    • @PrasadJayathilake 如果您的 sed 这样做,您可能将单引号更改为双引号。试试我写的命令。没有 grep 解决方案,也许你的意思是 awk。对于多个bbb,我建议打开一个包含更多详细信息的新问题,尽管这些可能也可以。
    • 或许sed '/bbb/{n;N;s/.*/zzz/p}' file?
    • @potong 这确实有效,但我很惊讶。我认为.* 将获得整个模式空间(第一行+\n+第二行)并将其替换为zzz,而不是在每一行上都这样做。编辑:没关系,现在我看到最后的p,这将导致再次打印zzz
    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 2019-05-27
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2018-02-11
    相关资源
    最近更新 更多