ANSI移動文字ESC [xCとESC [xD]を含むテキストをパイプしてその形式でテキストを出力する方法

ANSI移動文字ESC [xCとESC [xD]を含むテキストをパイプしてその形式でテキストを出力する方法

ESC[xCANSIモーションコードを含むファイルがあり、ESC[xDそれをフィルタリングしたいが、出力の各行でこれらのコードを考慮するようにします。

次の行を考えてみましょう。

this cat is greenESC[12DdogESC[4Cwhite

私はそれを次のように出力したい。

this dog is white

上記はESCエスケープコード\0x1b(または\033)を表します。

ベストアンサー1

私はより良い方法があると確信していますが(そしてより良いPerlがあると確信しています)、これはうまくいくようです:

perl -M5';$e="\x1b";' -lne 'chomp;if(/$e\[\d+[CD]/){$ns="";$p=0;while(/$e\[(\d+)([CD])/g){if(!$ns){$ns=$`;$p=length($ns)}$p+=($2eq"C"?+$1:-$1);($a=$'"'"')=~s/(^[^$e]+).*/$1/;if($a=~/^[^$e]/){substr($ns,$p,length($a),$a);$p+=length($a)}}print $ns}else{print $_}'

おすすめ記事