这是我的输入文件:
one
two
three
four
five
six
seven
eight
nine
ten
我想将文件转换为
one
two
three
NEW LINE
eight
nine
ten
/four/
替换/seven/
(包括)到NEW LINE
(包括)的行。
我可以用
做到这一点sed '/four/aNEW LINE
/four/,/seven/d' file.txt
但我想知道是否有一种更简单的方法,特别是一种不必重复模式的方式(因为我需要/four/
)。
编辑根据 fedorquis 评论问题,这也可能是在awk中(虽然对于"学术和#34;目的我感兴趣在sed解决方案中。)
编辑2 不幸的是,输入文件表明输入文件中存在单词的逻辑顺序(一个后跟两个通过三等)。在我的现实世界中#34;然而,事实并非如此。我不知道该文件有多少行,也不知道行四和七之前或之后的行。我知道的onl事情是有一行四,它(不一定是立即)后跟一行七。当我提出这个问题时,我很抱歉没有明确说明这一点,特别是因为 fedorqui 在他的回答中投入了太多精力。
答案 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