使用TCL替换文件中无法识别的字符

使用TCL替换文件中无法识别的字符,tcl,Tcl,我正在编写一个脚本来读取文件并替换一些字符,其中包括无法识别的字符,如 "^H^H^H^H^H^H^H^H^H" 实际上,该文件是通过重定向telnet会话的控制台输出生成的。我想删除这个角色。我必须从文件中删除“--更多--” 我试着用它来替换它们 set fileID [open "bar" r] set temp [open "temp.txt" w+] while {[eof $fileID] != 1} { gets $fileID lineInfo regsub -

我正在编写一个脚本来读取文件并替换一些字符,其中包括无法识别的字符,如

"^H^H^H^H^H^H^H^H^H"
实际上,该文件是通过重定向telnet会话的控制台输出生成的。我想删除这个角色。我必须从文件中删除“--更多--”

我试着用它来替换它们

set fileID [open "bar" r]
set temp [open "temp.txt" w+]
while {[eof $fileID] != 1} {
    gets $fileID lineInfo
    regsub -all "More" $lineInfo "" lineInfo
    regsub -all "--More--" $lineInfo "" lineInfo  #This is not working
    puts $temp $lineInfo
}
我可以删除“更多”,但我不能删除“--更多--”。有人能解释一下吗

我也试过了

regsub -all "^H^H^H^H^H^H^H^H^H" $lineInfo "" lineInfo  #This is also not working
这也不起作用


提前感谢。

我建议在正则表达式中使用
:print:
字符类来匹配所有“合理”字符-请参阅

regsub
的结果调用应该用空字符串替换所有不可打印的字符,因此我们使用一个否定字符类(通过
^
),因此正确的咒语如下所示:

set lineInfo [regsub -all {[^[:print:]]} $lineInfo ""]
至于删除“-More”--我有两个假设:

  • regsub
    --更多--
    视为一个以破折号开头的开关是混淆的。通过在所有开关之后将
    --
    传递到
    regsub
    可以很容易地解决此问题-请参阅
  • 文件中显示的“--More--”不是一个真正的实心字符串,它包含某些不可打印的字符。调试此类情况的常用方法是使用十六进制转储程序(如
    xxd
    或十六进制编辑器/查看器)检查文件

您应该编写
^H
,因为
\u0008
字符串映射也可能更容易进行简单的替换。如果可能,尝试从远程获取数据而不通过
more
之类的寻呼机将其破坏是值得的…