![如何通过管道传输包含 ANSI 移动字符 ESC[xC 和 ESC[xD] 的文本并输出相应格式的文本](https://linux22.com/image/225809/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%8C%85%E5%90%AB%20ANSI%20%E7%A7%BB%E5%8A%A8%E5%AD%97%E7%AC%A6%20ESC%5BxC%20%E5%92%8C%20ESC%5BxD%5D%20%E7%9A%84%E6%96%87%E6%9C%AC%E5%B9%B6%E8%BE%93%E5%87%BA%E7%9B%B8%E5%BA%94%E6%A0%BC%E5%BC%8F%E7%9A%84%E6%96%87%E6%9C%AC.png)
我有包含 ANSI 运动代码ESC[xC
和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 $_}'