sedでファイルから特定の範囲内を抜き出して改行を削除する(複数行にまたがる抽出範囲を改行を削除して一行にする)

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

sed -n '/START/,/END/{H;/START/h;/END/!d;x;s/\n/ /gp;}'
Sponsored Links

[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 ~]# sed -n '/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

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*