我经常需要grep
在大型文本文件中使用特定的表达式。由于某种原因,私人供应商决定使用CR
(回车符, \0D
) 来分隔文本文件特定行上的参数。
然而,该CR
字符由终端解释,使得 mygrep
或cat
命令几乎毫无用处。
那么如何在终端上显示以下文件的内容(例如xterm-256color
)。
$ hexdump /tmp/bla
0000000 3031 3030 3020 0d20 3335 310d 3132 3830
0000010 300d 302e 3031 3030 0d30 0a33
000001c
到目前为止,我尝试过但运气不佳:
$ TERM=dumb cat /tmp/bla
3.010000
答案1
GNU cat 有一些选项可以帮助打印包含此类特殊字符的文件:
-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
所以cat -v /tmp/bla
应该根据你的情况这样做。或者甚至可能-et
,它也以特殊的方式打印制表符和行尾。
答案2
更有用的可能是识别数据是十六进制的,并且 0xd 是回车符(\r
或^M
)。有几种方法可以解决这个问题:
问题说特定的线,并查看转储,这可能来自
script
,有人正在对文件进行编辑更改。在这种情况下,人们可能希望获得编辑更改的最终结果——全部在一行中。你可以使用col
为此,例如col /tmp/bla
虽然
col
没有想象中那么强大。 (我使用基于 vi-like-emacs 手册页过滤器的脚本来获取好的结果——但在我的回复中做了一个简单的脚本我可以使用 unix utils 以编程方式将 ANSI 控制代码“烧入”到文件中吗?您可能会发现它比col
)更有用。话又说回来,OP 希望将其视为多行。为此,可以这样做(将回车符转换为换行符):
tr '\r' '\n' </tmp/bla
顺便说一句,回车不是转义序列(尽管,就像任何字符,可以选择以 C 风格的“转义”格式表示它)。