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上的支持已过期,但是我无法使用stdbuf
和unbuffer
。我将其保持不变,也可以。
[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-将输出重定向到文件时处理退格控制字符的主要内容,如果未能解决你的问题,请参考以下文章
文件重定向,getline()获取一样,屏幕输出流,格式控制符dec,oct,hex,精度控制setprecision(int num),设置填充,cout.width和file(字符),进制输入(示