grep -oで、指定した条件のみを表示させるのはよく利用されていると思う。 ただ、このやり方だとPCREで指定しても改行を挟んで抽出し、かつ抽出した行の改行を削除して一行にするといった事ができない。 特定の範囲に対して抽出・改行の削除を行うことで同様の事を行えるのだが、その場合は以下のようにsedを利用してやることで行える。

bash
sed -n '/START/,/END/{H;/START/h;/END/!d;x;s/\n/ /gp;}'
shell
[root@BS-PUB-CENT7-01 ~]# cat test1.txt START AAA BBB CCC END sssss START !!! 222 ### END grgr= START 678 789 890 sss END [root@BS-PUB-CENT7-01 ~]# '/START/,/END/{H;/START/h;/END/!d;x;s/\n/ /gp;}' test1.txt START AAA BBB CCC END START !!! 222 ### END START 678 789 890 sss END

2017/05/10 追記

見直してみたら、頭の範囲指定いらなかった…。

bash
sed -n 'H;/START/h;/END/!d;x;s/\n/ /gp;'
shell
[root@BS-PUB-CENT7-01 ~]# sed -n 'H;/START/h;/END/!d;x;s/\n/ /gp;' test1.txt START AAA BBB CCC END START !!! 222 ### END START 678 789 890 sss END

後から見直したときのために、一応分解して記述。

bash
sed -n ' # パターンスペースをホールドスペースに追記 H; # 「START」から「END」までをホールドスペースへコピー /START/h;/END/!d; # ホールドスペースとパターンスペースを入れ替える x; # パターンスペースの内容を置換(s/~/~/g)して出力(p) s/\n/ /gp;' test1.txt
shell
[root@BS-PUB-CENT7-01 ~]# sed -n ' # パターンスペースをホールドスペースに追記 H; # 「START」から「END」までをホールドスペースへコピー /START/h;/END/!d; # ホールドスペースとパターンスペースを入れ替える x;p' test1.txt START AAA BBB CCC END START !!! 222 ### END START 678 789 890 sss END [root@BS-PUB-CENT7-01 ~]# sed -n ' # パターンスペースをホールドスペースに追記 H; # 「START」から「END」までをホールドスペースへコピー /START/h;/END/!d; # ホールドスペースとパターンスペースを入れ替える x; # パターンスペースの内容を置換 s/\n/ /gp;' test1.txt START AAA BBB CCC END START !!! 222 ### END START 678 789 890 sss END