この記事は約4分36秒で読むことができます。

sed デタラメな複数行を小綺麗な一行に変換する話

デタラメな複数行を小綺麗な一行に変換する

他にもいっぱいやり方あるとおもう

コード表示

[oracle@centos ~]$ cat ttt
UNKO IS
  BEATIFUL
   .

UNKO IS
  TITY
   .

UNKO IS
  FUNNY .
[oracle@centos ~]$ cat -n ttt
     1	UNKO IS
     2	  BEATIFUL
     3	   .
     4	
     5	UNKO IS
     6	  TITY
     7	   .
     8	
     9	UNKO IS
    10	  FUNNY .
[oracle@centos ~]$ cat ttt | sed -e '/^$/d ' -e ':a;N;/\.$/!ba;s/\n\s\{1,\}/ /g;s/ \.$/\./'
UNKO IS BEATIFUL.
UNKO IS TITY.
UNKO IS FUNNY.

デバッグしたやつ

コード表示

[oracle@centos ~]$ cat ttt | sedsed --debug -e '/^$/d ' -e ':a;N;/\.$/!ba;s/\n\s\{1,\}/ /g;s/ \.$/\./'
PATT:UNKO IS$
HOLD:$
COMM:/^$/ d
PATT:UNKO IS$
HOLD:$
COMM::a
COMM:N
PATT:UNKO IS\n  BEATIFUL$
HOLD:$
COMM:/\.$/ !b a
COMM:N
PATT:UNKO IS\n  BEATIFUL\n   .$
HOLD:$
COMM:/\.$/ !b a
COMM:s/\n\s\{1,\}/ /g
PATT:UNKO IS BEATIFUL .$
HOLD:$
COMM:s/ \.$/\./
PATT:UNKO IS BEATIFUL.$
HOLD:$
UNKO IS BEATIFUL.
PATT:$
HOLD:$
COMM:/^$/ d
PATT:UNKO IS$
HOLD:$
COMM:/^$/ d
PATT:UNKO IS$
HOLD:$
COMM::a
COMM:N
PATT:UNKO IS\n  TITY$
HOLD:$
COMM:/\.$/ !b a
COMM:N
PATT:UNKO IS\n  TITY\n   .$
HOLD:$
COMM:/\.$/ !b a
COMM:s/\n\s\{1,\}/ /g
PATT:UNKO IS TITY .$
HOLD:$
COMM:s/ \.$/\./
PATT:UNKO IS TITY.$
HOLD:$
UNKO IS TITY.
PATT:$
HOLD:$
COMM:/^$/ d
PATT:UNKO IS$
HOLD:$
COMM:/^$/ d
PATT:UNKO IS$
HOLD:$
COMM::a
COMM:N
PATT:UNKO IS\n  FUNNY .$
HOLD:$
COMM:/\.$/ !b a
COMM:s/\n\s\{1,\}/ /g
PATT:UNKO IS FUNNY .$
HOLD:$
COMM:s/ \.$/\./
PATT:UNKO IS FUNNY.$
HOLD:$
UNKO IS FUNNY.

方針としてはまず、空行消す。ここまでが一行!みたいな終了FOOTSTAMPが検出されるまで、Nコマンドで次の入力行をPSへ改行付きで蓄積。ここでのFOOTSTAMPは「.」。で、改行と1回以上のスペースを1個のスペースに置換し、行末の「.」直前のスペースは空文字に置換。分かってくるとめちゃ楽し。

所感

sedわかってきちゃったかも。前処理だけじゃなくてsedでプログラムも書いてみたいなー。

Leave a Reply

Your email address will not be published. Required fields are marked *