Tcl 如何在将输出保存到变量时剥离控制字符?

Tcl 如何在将输出保存到变量时剥离控制字符?,tcl,expect,Tcl,Expect,正在尝试从^[[1m和^[(B^[[m中删除控制字符,如^[[1mfoo^[(B^[[m) $ cat test.sh #! /bin/bash bold=$(tput bold) normal=$(tput sgr0) printf "%s\n" "Secret:" printf "$bold%s$normal\n" "foo" printf "%s\n" "Done"

正在尝试从
^[[1m
^[(B^[[m
中删除控制字符,如
^[[1mfoo^[(B^[[m

$ cat test.sh
#! /bin/bash

bold=$(tput bold)
normal=$(tput sgr0)

printf "%s\n" "Secret:"
printf "$bold%s$normal\n" "foo"
printf "%s\n" "Done"

expect
中,我看不到任何方法可以添加钩子来操作匹配/记录/等之前读取的数据。但是,您可以在管道中添加另一层,通过调整
test.exp
,在
expect
看到它之前,将ANSI转义从实际运行的程序输出中剥离出来:

set csi_re [subst -nocommands {\x1B\\[[\x30-\x3F]*[\x20-\x2F]*[\x40-\x7E]}]
spawn sh -c "~/Desktop/test.sh | sed 's/$csi_re//g'"

这使用
sed
test.sh
的输出中去除所有匹配的字符串。

转义序列取决于术语变量。您可以通过假装有哑终端来避免首先获取它们:

set env(TERM) dumb
spawn ~/Desktop/test.sh

这适用于提供的示例。从提供的信息无法判断它是否在实际情况下有效。这取决于程序是否实际使用termcaps生成转义序列。

来自所有输出,还是仅来自日志文件?您还可以通过Tcl端的
regsub
将其输入。这不会是一个问题影响日志,这似乎对OP很重要。
$ cat -e ~/Desktop/test.log
spawn ~/Desktop/test.sh^M$
Secret:^M$
^[[1mfoo^[(B^[[m^M$
Done^M$
set csi_re [subst -nocommands {\x1B\\[[\x30-\x3F]*[\x20-\x2F]*[\x40-\x7E]}]
spawn sh -c "~/Desktop/test.sh | sed 's/$csi_re//g'"
set env(TERM) dumb
spawn ~/Desktop/test.sh