如何通过评估bash控制字符来消除它们?

如何通过评估bash控制字符来消除它们?,bash,control-characters,Bash,Control Characters,我有一个输出文件(即屏幕)包含几个控制字符。在屏幕内部,我运行的程序使用控制字符刷新某些行(例如top或任何打印进度条的内容) 我想用PHP输出这个文件的尾部。如果我只是读入该文件并回显其内容(无论是使用PHP函数还是通过调用tail,输出都很混乱,而且比最后几行多得多,因为它还包含被覆盖的内容。如果我改为在命令行中运行tail,它会返回我想要的结果,因为终端会计算控制字符 所以我的问题是:有没有一种方法可以评估控制字符,获得终端将向我显示的输出,然后我可以在其他地方使用(例如,写入文件)?我不

我有一个输出文件(即
屏幕
)包含几个控制字符。在屏幕内部,我运行的程序使用控制字符刷新某些行(例如
top
或任何打印进度条的内容)

我想用PHP输出这个文件的
尾部。如果我只是读入该文件并回显其内容(无论是使用PHP函数还是通过调用
tail
,输出都很混乱,而且比最后几行多得多,因为它还包含被覆盖的内容。如果我改为在命令行中运行
tail
,它会返回我想要的结果,因为终端会计算控制字符


所以我的问题是:有没有一种方法可以评估控制字符,获得终端将向我显示的输出,然后我可以在其他地方使用(例如,写入文件)?

我不确定“评估”控制字符是什么意思,但你可以很容易地删除它们

下面是一个使用
sed
的示例,但是如果您已经在使用PHP,它的内部正则表达式处理功能似乎更合适

$ sed 's,\x1B\[[0-9?;]*[a-zA-Z],,g' file.dat
将把
file.dat
的内容转储到标准输出,并删除所有内容。(我很确定,除了文件包含无效转义序列外,不会删除任何其他内容,在这种情况下,操作定义错误。)

下面是一个小演示:

$echo-e“这是\033[31m a\033[umessy\033[46M字符串。\033[0m”>file.dat
$cat file.dat
#上述命令的输出未显示为保护幼儿
#可能正在浏览此网站。
$reset#您的终端
$sed's、\x1B\[[0-9?;]*[a-zA-Z]、g'file.dat
这是一根乱七八糟的绳子。

less
程序内置了一些更高级的逻辑来选择性地替换一些转义序列。请阅读相关选项。

我不确定“评估”控制字符是什么意思,但您可以轻松删除它们

下面是一个使用
sed
的示例,但是如果您已经在使用PHP,它的内部正则表达式处理功能似乎更合适

$ sed 's,\x1B\[[0-9?;]*[a-zA-Z],,g' file.dat
将把
file.dat
的内容转储到标准输出,并删除所有内容。(我很确定,除了文件包含无效转义序列外,不会删除任何其他内容,在这种情况下,操作定义错误。)

下面是一个小演示:

$echo-e“这是\033[31m a\033[umessy\033[46M字符串。\033[0m”>file.dat
$cat file.dat
#上述命令的输出未显示为保护幼儿
#可能正在浏览此网站。
$reset#您的终端
$sed's、\x1B\[[0-9?;]*[a-zA-Z]、g'file.dat
这是一根乱七八糟的绳子。

less
程序内置了一些更高级的逻辑来选择性地替换一些转义序列。阅读相关选项。

@5gon12eder的答案去掉了一些控制字符(谢谢!),但它没有处理对我来说更重要的回车部分

我发现我可以删除从一行开始到该行中最后一次回车的任何内容,然后保留所有内容,因此下面是我的sed命令:

sed 's/^.*\r\([^\r]\+\)\r\?$/\1\r/g'
然后可以使用@5gon12eder的答案进一步清理输出:

cat screenlog.0 | sed 's/^.*\r\([^\r]\+\)\r\?$/\1\r/g' | sed 's,\x1B\[[0-9?;]*[a-zA-Z],,g'

这看起来和我想要的完全一样。

@5gon12eder的答案去掉了一些控制字符(谢谢!),但它没有处理对我来说更重要的回车部分

我发现我可以删除从一行开始到该行中最后一次回车的任何内容,然后保留所有内容,因此下面是我的sed命令:

sed 's/^.*\r\([^\r]\+\)\r\?$/\1\r/g'
然后可以使用@5gon12eder的答案进一步清理输出:

cat screenlog.0 | sed 's/^.*\r\([^\r]\+\)\r\?$/\1\r/g' | sed 's,\x1B\[[0-9?;]*[a-zA-Z],,g'

结合起来,这看起来和我想要的完全一样。

终端处理的是控制字符,而不是外壳。它们对非终端没有任何意义。手动剥离它们是否还不够?您的发行版中可能没有预先编写并包含一个,但编写读取文件字节b的筛选器应该不会太困难y字节,省略输出不需要的内容。您所需要的只是一个要消除的不同字符/序列的列表…@twalberg:我认为这不是仅仅消除它们的问题(PHP通过忽略它们有效地实现了这一点)。假设我运行了一个程序来打印它的进度(完成0%,完成5%,完成10%,依此类推,不写新行,而是重写同一行)然后,仅剥离控制字符将导致所有这些百分比值都出现在输出中,而我只希望最新的百分比值出现在输出中。@EtanReisner:感谢您的澄清,我将相应地更新我的问题。您将筛选理解终端控制字符的内容。我不确定是否有此类内容(终端除外)尽管存在。终端处理的是控制字符,而不是外壳。它们对非终端没有任何意义。手动剥离它们是否不够?可能没有一个预写的字符包含在您的发行版中,但编写一个逐字节读取文件并忽略输出stuf的筛选器应该不会太困难f这不是你想要的。你所需要的只是一个你想要消除的不同字符/序列的列表…@twalberg:我认为这不是仅仅消除它们的问题(PHP通过忽略它们来有效地做到这一点)。假设我运行了一个程序来打印它的进度(0%完成,5%完成,10%完成等等,不写新行,而是重写同一行)然后只去掉控制字符将导致所有这些百分比值都出现在输出中,而我只希望最新的百分比值出现在输出中。@EtanReisner:谢谢澄清,我将更新我的问题acco