Scrapbox, 便利ですよね. 私も愛用しています. そんなScrapboxに書いたテキストを, はてな記法っぽく変換したい時があると思います. ...あるんです.
というわけで, こういうスクリプトを書きました:
#!/usr/bin/env perl use strict; use warnings; use utf8; while (my $line = <STDIN>) { $line =~ s/^([\s\t]+)/'-' x length($1) . ' '/e; print $line; }
このコードを, 例えば sb2htn
みたいな名前で保存しておいて, 後はScrapboxに書かれたテキストを適当にドラッグしてコピーして,
$ pbpaste | sb2htn | pbcopy
...とかすれば, はてな記法っぽく変換されたものがクリップボードに入っているので, 後はよしなにペーストすることができます. よかったですね.
余談: 正規表現のe
オプション
上のコードのポイントは正規表現のe
オプションを使っているところで, これは置換後の文字列をPerlのコードとして解釈して, その実行結果で置換してくれる... という挙動をします.
今回の場合, 正規表現が s/^([\s\t]+)/'-' x length($1) . ' '/e
なので, ^([\s\t]+)
にマッチしたものについて, '-' x length($1) . ' '
をPerlのコードとして実行した結果で置き換えてくれるわけです.
例えば, $line = ' sample'
(sample
の前に半角スペース3つ) なら, $1 = ' '
(半角スペース3つ) となるので, length($1) = 3
となり, '---'
と ' '
を文字列で結合した '--- '
がマッチした文字列と置き換えられる... ということになります.
という感じで, 正規表現にマッチしたものに対して, 任意のPerlコードを実行出来る正規表現のe
オプションはかっなり強力です.
「これ正規表現で書き換えるの難しそうだな...」という時も, e
オプションを使えばサクッと実現出来たりするので, 脳の片隅で覚えておくと良いかもしれません.