如何用sed中的一行替换两个模式之间的行?

如何用sed中的一行替换两个模式之间的行?,sed,awk,Sed,Awk,这是我的输入文件: one two three four five six seven eight nine ten 我想把这个文件变成 one two three NEW LINE eight nine ten 和塞德。也就是说,我想将/four/(包括)到/seven/(包括)的行替换为单行新行 我可以用它来做 sed '/four/aNEW LINE /four/,/seven/d' file.txt 但我想知道是否有一种更简单的方法,特别是不必重复模式的方法(我需要使用/four/

这是我的输入文件:

one
two
three
four
five
six
seven
eight
nine
ten
我想把这个文件变成

one
two
three
NEW LINE
eight
nine
ten
和塞德。也就是说,我想将
/four/
(包括)到
/seven/
(包括)的行替换为单行
新行

我可以用它来做

sed '/four/aNEW LINE
/four/,/seven/d' file.txt
但我想知道是否有一种更简单的方法,特别是不必重复模式的方法(我需要使用
/four/

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


编辑2不幸的是,输入文件表明输入文件中的单词有一个逻辑顺序(一个接两个接三个等)。然而,在我的“现实世界”问题中,情况并非如此。我不知道文件有多少行,也不知道第四行和第七行的前后位置。我唯一知道的是,第四行后面(不一定马上)跟着第七行。我很抱歉在我问这个问题时没有清楚地说明这一点,特别是因为费多尔基在他的回答中付出了太多的努力

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


使用
awk
可以执行以下操作:

$ awk '/four/ {f=1} !f; /seven/ {print "NEW LINE"; f=0}' file
one
two
three
NEW LINE
eight
nine
ten
它所做的是不断更新停止打印的标志
f

  • 当找到“四”时,标志被激活
  • 当找到“seven”时,该标志被停用,同时打印
    新行

    • Perl非常简洁,您不需要重复任何关键字:

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

      以下是您在
      sed
      中的操作:

      $ sed ':a;N;s/four.*seven/NEW LINE/;ba' file
      one
      two
      three
      NEW LINE
      eight
      nine
      ten
      
      逻辑和答案非常相似。将整个文件拖入一个由换行符分隔的长行中,替换从4到7的所有内容,并将其替换为新行

      这可能适合您(GNU-sed&bash):


      @费多尔基,是的,看我的编辑。来吧!你在作弊!你重复3,你没有真正匹配任何模式,只是依靠行号!!!!:-)我上钩了:)改进了,@MarkSetchell谢谢你的推动,让我学会了怎么做:)你的解决方案的“问题”是八跟七纯粹是巧合。在我的“现实世界”问题中,我只知道有一行“四”和“七”,而“七”在“四”之后。但我不知道中间有多少行,也不知道后面紧接着什么是“七”。@RenéNyffenegger有趣的是,在不断尝试之后,我想出了一个解决方案。。。你在问题中评论的是哪一个:)
      sed-e'/seven/a\newline'-e'/four/,/seven/d'文件
      。尽管如此,玩它还是很不错的,而且看到了其他答案,都很聪明!只需更新以删除botk
      sed
      awk
      中的数字引用。请注意“s//”运算符上的“s”标志,它允许“.”匹配换行符。
      $ sed ':a;N;s/four.*seven/NEW LINE/;ba' file
      one
      two
      three
      NEW LINE
      eight
      nine
      ten
      
      sed $'/^four/{:a;N;/^seven/McNEWLINE\nba}' file