我编写了一个Java控制台应用程序,该应用程序使用结尾的回车符(\ r)而不是换行符(\ n)反复将其状态打印到控制台,以将输出保持在一个屏幕上。我也想将输出输出到文件中,例如
java -jar my-jar.jar | tee /tmp/my-jar.log
但是,将所有内容都写入该文件没有任何意义,只是在应用程序末尾可见。换句话说,我并不需要所有以\ r结尾的“行”。
例子:我编码
System.out.print("hello\r")
Thread.sleep(2000);
System.out.println("world")
屏幕上会出现“ hello”,两秒钟后将其替换为“ world”。因此,程序结束后,用户只能在屏幕上看到“世界”。很好,是正确的。
但是,如果我将其存放到文件中,则该文件包含“ hello \ rworld \ n”,但我只希望它包含“ world \ n”。
我该如何在命令行上而不是在Java中进行编码(这就是为什么问题在这里而不是在SO上)的原因?
默认情况下,sed
读取换行符分隔的输入。此命令将删除\r
行中最后一个字符之前的所有内容:
sed 's/.*\r//'
例如:
$ echo $'line1\n\hi\rhello\rworld' | sed 's/.*\r//'
line1
world
要将其与结合使用tee
,我们可以使用流程替换:
echo $'line1\n\hi\rhello\rworld' | tee >(sed 's/.*\r//' >Outfile)
在bash下,该构造>(...)
称为流程替换。它在括号中运行命令,并将其放入类似文件的对象中。tee
写入文件状对象,然后命令处理输入。
同样,这会删除\r
以换行符分隔的行中的最后一个之前的所有内容:
awk -F'\r' '{print $NF}'
该选项-F'\r'
将字段分隔符设置为回车符。因此,我们只想$NF
在每个换行符分隔的行上打印最后一个字段。因此,print $NF
。
例如:
$ echo $'line1\n\hi\rhello\rworld' | awk -F'\r' '{print $NF}'
line1
world
配合使用tee
:
echo $'line1\n\hi\rhello\rworld' | tee >(awk -F'\r' '{print $NF}' >Outfile)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句