Top/Devel/ShellScript/制御文字やエスケープシーケンスの除去

制御文字やエスケープシーケンスの除去 の変更点はてなブックマーク


scriptコマンドで記録したログファイルなど、制御文字やエスケープシーケンスが含まれたファイルをプレーンテキストに変換する方法について調べると、col -bを使えと書いてあります。

しかしcol -bでは、colが認識できない制御文字が含まれる場合やバックスペースが連続した場合に、期待通りの結果が得られないことがあります。

そこで、制御文字やエスケープシーケンスを除去するスクリプトを書いてみました。

&color(#F00){恐らく色々間違ってます。読めればいいという人向け。};

#ref(rm_ctrl_chr.sh)

#code(bash,nonumber){{
#!/bin/bash

RM_CTRL_CHR_CMD=`basename $0`
RM_CTRL_CHR_REPEAT=20
i=0
j=0


if [ $# -ne 1 -o ! -f "$1" ]; then
  echo "Usage: $RM_CTRL_CHR_CMD file" 1>&2
  exit 1
fi

cp $1 $1.tmp.a$i

sed 's/.*\x0D\([^$]\)/\1/g' $1.tmp.a$i > $1.tmp.a`expr $i + 1`
rm -f $1.tmp.a$i
i=`expr $i + 1`
sed 's/\x0D//g' $1.tmp.a$i > $1.tmp.a`expr $i + 1`
rm -f $1.tmp.a$i
i=`expr $i + 1`
sed 's/\x07//g' $1.tmp.a$i > $1.tmp.a`expr $i + 1`
rm -f $1.tmp.a$i
i=`expr $i + 1`
sed 's/\x1B\[K//g' $1.tmp.a$i > $1.tmp.a`expr $i + 1`
rm -f $1.tmp.a$i
i=`expr $i + 1`
sed 's/\x1B]0;//g' $1.tmp.a$i > $1.tmp.a`expr $i + 1`
rm -f $1.tmp.a$i
i=`expr $i + 1`
sed 's/\x1B\[\([0-9]\{2\}\)\{0,1\}\(;[0-9]\{2\}\)\{0,1\}m//g' $1.tmp.a$i > $1.tmp.a`expr $i + 1`
rm -f $1.tmp.a$i
i=`expr $i + 1`

mv $1.tmp.a$i $1.tmp.b0

for j in `seq 0 $RM_CTRL_CHR_REPEAT`; do
  sed 's/[^\x08]\{'$j'\}\(\x08*\)\x1B\['$j'P/\1/g' $1.tmp.b$j > $1.tmp.b`expr $j + 1`
  rm -f $1.tmp.b$j
done

mv $1.tmp.b`expr $RM_CTRL_CHR_REPEAT + 1` $1.tmp.c0

for j in `seq 0 $RM_CTRL_CHR_REPEAT`; do
  sed 's/[^\x08]\x08//g' $1.tmp.c$j > $1.tmp.c`expr $j + 1`
  rm -f $1.tmp.c$j
done
mv -f $1.tmp.c`expr $RM_CTRL_CHR_REPEAT + 1` $1


unset RM_CTRL_CMD
unset RM_CTRL_CHR_REPEAT
unset i
unset j
}}

バックスペースの置換がもの凄く無理矢理な感じです。

*関連
-[[../ログファイル名を現在日時にしたscriptコマンド]]

*Amazon
#amazon(4873112672,left)
差分 一覧