Bash-将输出重定向到文件时处理退格控制字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash-将输出重定向到文件时处理退格控制字符相关的知识,希望对你有一定的参考价值。

我必须在后台运行第三方程序并将其输出捕获到文件中。我只是使用the_program > output.txt来执行此操作。然而,所述程序的编码器决定为浮华的,并使用\b字符擦除先前的值,实时显示已处理的行。因此,output.txt中的每一行都以Lines: 1(b)2(b)3(b)4(b)5结尾,(b)是具有ASCII码08的不可打印字符。我希望该行以Lines: 5结尾。

我知道我可以原样编写并对文件using AWK进行后处理,但是我想知道是否有可能通过使用某种shell选项或通过管道来就地处理控制字符一些命令一起使用,以便在程序完成后,该行将变为Lines: 5,而无需运行任何其他命令?

编辑:

仅作说明:我在这里写的是一个简化版本,程序处理的实际行数为十万,因此字符串的结尾很长。

答案

感谢您的评论!我最终将该程序的输出传递给我在问题中链接的AWK脚本。最后,我得到了格式正确的文件。

the_program | ./awk_crush.sh > output.txt

唯一的缺点是,即使初始输出超过5M,并且应该以较小的块传递,我也只会在程序本身完成后才获得输出。我不知道确切的原因,也许AWK脚本在stdin上等待EOF。无论哪种方式,在更现代的系统上,我都会使用

stdbuf -oL the_program | ./awk_crush.sh > output.txt

逐行处理输出。我在RHEL4上的支持已过期,但是我无法使用stdbufunbuffer。我将其保持不变,也可以。

[awk_crush.sh的内容基于this answer,除了^H序列(应该是通过VIM命令输入的ASCII 08字符)替换为转义序列\b

#!/usr/bin/awk -f
function crushify(data) 
  while (data ~ /[^\b]\b/) 
      gsub(/[^\b]\b/, "", data) 
                                                       
  print data


crushify($0)

[基本上,它用空字符串替换\b\b本身之前的字符,并在字符串中有\b时重复它-正是我所需要的。尽管它并不关心其他转义序列,但是如果有必要,可以使用Thomas Dickey来提供更完整的SED solution

另一答案

当the_program结束时,管道将开始执行./awk_crush.sh。如果要逐行执行此操作很复杂,因为管道和重定向只会更改虚拟输出设备。我认为也许您可以在Linux中创建一个虚拟设备来逐行处理重定向,然后将输出重定向到此自定义设备。

以上是关于Bash-将输出重定向到文件时处理退格控制字符的主要内容,如果未能解决你的问题,请参考以下文章

通过bash将输出重定向到文件[重复]

文件重定向,getline()获取一样,屏幕输出流,格式控制符dec,oct,hex,精度控制setprecision(int num),设置填充,cout.width和file(字符),进制输入(示

将输出重定向到文件,然后返回到 Java 中的控制台

将跟踪输出重定向到控制台

我们如何将 Java 程序控制台输出重定向到多个文件?

是否可以检查程序输出重定向到文件的控制台的宽度?