Masteries

技術的なことや仕事に関することを書いていきます.

Scrapboxに書かれたテキストをいい感じにはてな記法っぽく変換するスクリプト

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オプションを使えばサクッと実現出来たりするので, 脳の片隅で覚えておくと良いかもしれません.