制御文字やエスケープシーケンスの除去![はてなブックマーク はてなブックマーク](https://b.hatena.ne.jp/entry/image/http://cubic9.com/Devel/ShellScript/%C0%A9%B8%E6%CA%B8%BB%FA%A4%E4%A5%A8%A5%B9%A5%B1%A1%BC%A5%D7%A5%B7%A1%BC%A5%B1%A5%F3%A5%B9%A4%CE%BD%FC%B5%EE/)
scriptコマンドで記録したログファイルなど、制御文字やエスケープシーケンスが含まれたファイルをプレーンテキストに変換する方法について調べると、col -bを使えと書いてあります。
しかしcol -bでは、colが認識できない制御文字が含まれる場合やバックスペースが連続した場合に、期待通りの結果が得られないことがあります。
そこで、制御文字やエスケープシーケンスを除去するスクリプトを書いてみました。
恐らく色々間違ってます。読めればいいという人向け。
|
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
|
バックスペースの置換がもの凄く無理矢理な感じです。
関連
Amazon