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

sed 複数行を1行に置換する話

参考文献

このお方のtwwiterのシェル芸大好きです。

sedのデバッグやHTML化ができる『sedsed』  

まえがき

折角だからpythonデバッグツールあるぽいので、それでsedと仲良くなりたい。

コード表示

[oracle@centos ~]$ git clone https://github.com/aureliojargas/sedsed
[oracle@centos ~]$ sudo cp sedsed/sedsed.py /usr/local/bin/sedsed
[sudo] oracle のパスワード:
[oracle@centos ~]$ sedsed --version
sedsed v1.2-dev

複数行を1行に置換する

他にもいっぱいあるとおもう

コード表示

[oracle@centos web]$ cat ttt
a
b
c
[oracle@centos web]$ cat -n ttt
     1	a
     2	b
     3	c
[oracle@centos web]$ sed -n 'H;${x;s/\n/ /g;s/^ //;p}' ttt
a b c

デバッグしたやつ

コード表示

[oracle@centos ~]$ cat ttt | sedsed --debug -n 'H;${x;s/\n/ /g;s/^ //;p}'
PATT:a$
HOLD:$
COMM:H
PATT:a$
HOLD:\na$
COMM:$ {
PATT:a$
HOLD:\na$
PATT:b$
HOLD:\na$
COMM:H
PATT:b$
HOLD:\na\nb$
COMM:$ {
PATT:b$
HOLD:\na\nb$
PATT:c$
HOLD:\na\nb$
COMM:H
PATT:c$
HOLD:\na\nb\nc$
COMM:$ {
COMM:x
PATT:\na\nb\nc$
HOLD:c$
COMM:s/\n/ /g
PATT: a b c$
HOLD:c$
COMM:s/^ //
PATT:a b c$
HOLD:c$
COMM:p
a b c
PATT:a b c$
HOLD:c$
COMM:}
PATT:a b c$
HOLD:c$

HコマンドでPSの内容がHSへ改行付きでコピーされている。b,cも同じ様に実行されていき、HSに改行付で蓄えられている。ここまでがHコマンドの内容。xコマンドでHSの内容とPSの内容を交換している。パタンスペースに対してs/\n/ /gを実行し、改行をスペース区切りに変換した後、行頭が空白のものを空文字に置換している。で、最後にpコマンドでPSの内容を標準出力に出力している。-nオプションでデフォルトの挙動であるパタンスペースを出力する動きを抑止している。

抑止しなかったやつ。入力行ごとにグループ化されているコマンド郡は最終行「$」に対してまとまって実行されていて、a,bは最終行でないから実行されていなかったことが分かった。最終行でなくとも${は評価されているんだな。ぁぁぁ楽しい。面白い!!

コード表示

[oracle@centos ~]$ cat ttt | sedsed --debug 'H;${x;s/\n/ /g;s/^ //;p}'
PATT:a$
HOLD:$
COMM:H
PATT:a$
HOLD:\na$
COMM:$ {
PATT:a$
HOLD:\na$
a
PATT:b$
HOLD:\na$
COMM:H
PATT:b$
HOLD:\na\nb$
COMM:$ {
PATT:b$
HOLD:\na\nb$
b
PATT:c$
HOLD:\na\nb$
COMM:H
PATT:c$
HOLD:\na\nb\nc$
COMM:$ {
COMM:x
PATT:\na\nb\nc$
HOLD:c$
COMM:s/\n/ /g
PATT: a b c$
HOLD:c$
COMM:s/^ //
PATT:a b c$
HOLD:c$
COMM:p
a b c
PATT:a b c$
HOLD:c$
COMM:}
PATT:a b c$
HOLD:c$
a b c

Leave a Reply

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