制御文字をエスケープするスクリプト

MySQLでtsvにダンプしたりすると制御文字が

\<制御文字>

とエスケープされる。

テキストファイルでは、なるべく1行を1レコードをして扱いたいので、Perlで制御文字をエスケープ文字に変換するスクリプトを書いてみた。

#!/usr/bin/env perl
use strict;
use warnings;

use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

while (my $line = <STDIN>) {
  while ($line =~ /(?:\A|[^\\])\\\Z/) {
    $line .= <STDIN>;
  }

  chomp $line;

  $line =~ s/\\\x08/\\b/g;
  $line =~ s/\\\x09/\\t/g;
  $line =~ s/\\\x0a/\\n/g;
  $line =~ s/\\\x0d/\\r/g;
  $line =~ s/\\\x1a/\\Z/g;

  print "$line\n";
}


shell> cat foo.tsv | mysqldumpesc > bar.tsv

「\<改行コード>」を「\n」に変換してくれる。


「\n」はMySQLのエスケープ文字なので、変換したデータをそのままインポートすれば、制御文字に展開してくれる。