我有一个 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,多余的空格将覆盖前面行中的任何数字。