如何用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'文件
。尽管如此,玩它还是很不错的,而且看到了其他答案,都很聪明!只需更新以删除botksed
和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