如何在sed中使用单行替换两个模式之间的线?

时间:2014-03-28 16:49:00

标签: sed awk

这是我的输入文件:

one
two
three
four
five
six
seven
eight
nine
ten

我想将文件转换为

one
two
three
NEW LINE
eight
nine
ten
与sed。也就是说,我想用/four/替换/seven/(包括)到NEW LINE(包括)的行。

我可以用

做到这一点
sed '/four/aNEW LINE
/four/,/seven/d' file.txt

但我想知道是否有一种更简单的方法,特别是一种不必重复模式的方式(因为我需要/four/)。

编辑根据 fedorquis 评论问题,这也可能是在awk中(虽然对于"学术和#34;目的我感兴趣在sed解决方案中。)

编辑2 不幸的是,输入文件表明输入文件中存在单词的逻辑顺序(一个后跟两个通过等)。在我的现实世界中#34;然而,事实并非如此。我不知道该文件有多少行,也不知道行之前或之后的行。我知道的onl事情是有一行,它(不一定是立即)后跟一行。当我提出这个问题时,我很抱歉没有明确说明这一点,特别是因为 fedorqui 在他的回答中投入了太多精力。

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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

答案 2 :(得分:3)

以下是sed中的操作方法:

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

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

答案 3 :(得分:1)

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

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