grep -oで、指定した条件のみを表示させるのはよく利用されていると思う。 ただ、このやり方だとPCREで指定しても改行を挟んで抽出し、かつ抽出した行の改行を削除して一行にするといった事ができない。 特定の範囲に対して抽出・改行の削除を行うことで同様の事を行えるのだが、その場合は以下のようにsedを利用してやることで行える。
sed -n '/START/,/END/{H;/START/h;/END/!d;x;s/\n/ /gp;}'
[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 追記
見直してみたら、頭の範囲指定いらなかった…。
sed -n 'H;/START/h;/END/!d;x;s/\n/ /gp;'
[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
後から見直したときのために、一応分解して記述。
sed -n '
# パターンスペースをホールドスペースに追記
H;
# 「START」から「END」までをホールドスペースへコピー
/START/h;/END/!d;
# ホールドスペースとパターンスペースを入れ替える
x;
# パターンスペースの内容を置換(s/~/~/g)して出力(p)
s/\n/ /gp;' test1.txt
[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