【问题标题】:How do I replace lines between two patterns with a single line in sed?如何在 sed 中用单行替换两个模式之间的行?
【发布时间】:2014-03-29 06:24:47
【问题描述】:

这是我的输入文件:

one
two
three
four
five
six
seven
eight
nine
ten

我想把文件变成

one
two
three
NEW LINE
eight
nine
ten

使用 sed。也就是说,我想用单行NEW LINE 替换从/four/(包括)到/seven/(包括)的行。

我可以这样做

sed '/four/aNEW LINE
/four/,/seven/d' file.txt

但我想知道是否有更简单的方法,尤其是无需重复模式的方法(就像我需要使用 /four/ 一样)。

编辑根据 fedorquis 评论问题,这也可以在 awk 中(尽管出于“学术”目的,我会对 sed 解决方案感兴趣。)

编辑 2 不幸的是,输入文件表明输入文件中的单词存在逻辑顺序(one 其次是 two 三个等)。然而,在我的“现实世界”问题中,情况并非如此。我不知道文件有多少行,也不知道行 fourseven 之前或之后的内容。我唯一知道的是有一行four(不一定立即)后面跟着一行7。很抱歉,当我问这个问题时,我没有清楚地说明这一点,特别是因为 fedorqui 在他的回答中付出了很多努力。

【问题讨论】:

  • @fedorqui,是的,看看我的编辑。

标签: sed awk


【解决方案1】:

Perl 相当简洁,不需要重复任何关键字:

perl -00 -pe 's/four.*seven/NEW_LINE/s'

【讨论】:

  • 注意“s///”操作符上的“s”标志——它允许“.”匹配换行符。
【解决方案2】:

这是您在sed 中的做法:

$ sed ':a;N;s/four.*seven/NEW LINE/;ba' file
one
two
three
NEW LINE
eight
nine
ten

逻辑与Glenn's 答案非常相似。将整个文件放入由换行符分隔的一长行中,并将从四到七的所有内容替换为 NEW LINE。

【讨论】:

    【解决方案3】:

    使用sed,您可以从four 行删除到seven 并在seven 之后追加。这实际上是您在问题中发布的内容:)

    $ sed -e '/seven/a \NEW LINE' -e '/four/,/seven/d' file
    one
    two
    three
    NEW LINE
    eight
    nine
    ten
    

    使用awk,您可以:

    $ awk '/four/ {f=1} !f; /seven/ {print "NEW LINE"; f=0}' file
    one
    two
    three
    NEW LINE
    eight
    nine
    ten
    

    它的作用是不断更新停止打印的标志f

    • 当找到“四”时,标志被激活。
    • 找到“七”时,该标志被停用,同时打印NEW LINE

    【讨论】:

    • 加油!你在sed中作弊!你重复 3,你并没有真正匹配任何模式,只是依赖于行号!!!! :-)
    • 我上钩了 :) 改进了,@MarkSetchell 感谢您的推动,让我学会了如何去做 :)
    • 您的解决方案的“问题”是 8 跟在 7 之后纯属巧合。在我的“现实世界”问题中,我只知道有一行“四”和“七”,而“七”在“四”之后。但我不知道中间有多少行,也不知道“七”后面紧跟着的是什么。
    • @RenéNyffenegger 有趣的是,在尝试和尝试之后,我想出了一个解决方案......这是你在你的问题中评论的那个:) sed -e '/seven/a \NEW LINE' -e '/four/,/seven/d' file。不过,玩它很高兴,并且看到了其他答案,都非常聪明!刚刚更新以删除 botk sedawk 中的数字引用。
    【解决方案4】:

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

    sed $'/^four/{:a;N;/^seven/McNEWLINE\nba}' file
    

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      相关资源
      最近更新 更多