gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:05 24 4
gpt4 key购买 nike

我必须在后台运行第三方程序并将其输出捕获到文件中。我只是使用 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 并且应该以较小的 block 传递。我不知道确切的原因,也许 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中重复它字符串 - 正是我所需要的。虽然它不关心其他转义序列,但如果有必要,还有一个更完整的 SED solution作者:Thomas Dickey

关于linux - Bash - 将输出重定向到文件时处理退格控制字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34282174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com