sed -rn 'p;/bbb/,/ddd/H;/ddd/{g;s/^\n//;p}' file.txt
说明:
sed内部有两个空间,一个模式空间,一个保留空间。
通常sed将文本内容逐行读入模式空间进行处理,保留空间仅用于暂时保留内部数据用于与模式空间的数据交换。可以这么理解:模式空间用于与外部的数据交换,保留空间用于sed内部的数据交换,最终还是要通过模式空间输出。
/bbb/,/ddd/H; 逐行处理时将bbb~ddd区段的文本从sed的模式空间附加到保留空间内,每行内容之间以\n分割,因此,最终保留空间内容为:\nbbb\nccc\nddd
/ddd/{g;s/^\n//;p} 处理到ddd这行后,通过g命令获取保留空间内容到模式空间,通过s替换命令去除开头的\n,p命令打印。
sed除了可以将输出重定向到新文件外,加 -i 选项还可以直接改写原文件。
------------------------------------------
也可以通过vim手动编辑。
vim file.txt
光标定位于第二行,即bbb这行
输入命令 3yy ,即向下复制三行
光标定位于第五行,即ddd这行
输入命令 p,粘贴
输入命令 :wq , 保存并退出
awk '{print $0;}n ~/1/{a=a"\n"$0;}/^bbb/{a=$0;n=1;}/^ddd/{print a;n=0;}' file_name