继续打印带有回车符的管道值

继续打印带有回车符的管道值

我有一个 bash 脚本,我在其中使用命令进行一些过滤sed,然后将结果通过管道传输以gzip再次压缩输出。过滤后的输出格式为<id>,<title>,<bool (0 or 1)>.我想打印 id,但使用尾随回车而不是换行符,以便它们都相互打印,因为 id 正在增加。我的方法是这样的:

<chained sed commands> \
| tee >(sed -re "s/^([0-9]+).*/\1\r/") | gzip -c > outputfile.gz

然而,这确实在每一行上添加了换行符,并且不会产生仅在一行上打印的预期结果。

答案1

您需要将进度指示器输出到 stderr,以便它不会出现在 gzip 压缩的数据中。我会用perl这个:

<chained sed commands> | perl -pe 'print STDERR "$1\r" if /^(\d+)/' | gzip -c > outputfile.gz

perl -p意味着创建一个自动循环,打印每个输入行(可能已修改)。定义-e要在循环内执行的表达式。

该表达式与行开头的数字相匹配,如果找到,则将其打印到 stderr 并带有尾随回车符。输入被传递到要压缩的输出。

视觉效果更好的一种变体是将 print 语句值替换为"\r$1 "\。这会将光标留在末尾,如果当前 id 小于前一个 id,多余的空格将覆盖前面行中的任何数字。

相关内容