我试图在bash中使用一些东西来显示打印而不是解释的文件中的行尾。 该文件是SSIS / SQL Server的转储文件,正在被Linux机器读入以进行处理。
vi,less,more等中是否有任何开关?
除了查看行尾之外,我还需要知道行尾的类型(CRLF或LF)。 我如何找到答案?
一般提示:如果您对可以使用哪个* nix / cygwin命令有所了解,则始终可以查看其手册页以搜索可能会提供所需功能的开关。 例如man less。
您可以使用file实用程序来指示行尾的类型。
Unix:
$ file testfile1.txt
testfile.txt: ASCII text
" DOS":
$ file testfile2.txt
testfile2.txt: ASCII text, with CRLF line terminators
要将" DOS"转换为Unix:
$dos2unix testfile2.txt
要从Unix转换为" DOS":
$unix2dos testfile1.txt
转换已转换的文件没有任何效果,因此可以安全地盲目运行(即,无需先测试格式),尽管通常适用免责声明。
现在,它们有时有时分别称为" fromdos"和" todos"(在Ubuntu 10.4+中就是这种情况)
@JessChadwick:是的,但是仅当您明确地将tofrodos软件包与sudo apt-get install tofrodos一起安装时-就像您必须运行sudo apt-get install dos2unix来获取dos2unix和unix2dos一样。
Actully dos2unix无法完成所有工作,我认为stackoverflow.com/questions/23828554/dos2unix-doesnt-convert-m提供了最佳答案
@nathan:dos2unix的失败之处是什么?该问题的OP仅模糊地描述了该问题。
在dos2unix命令之前和之后的@DennisWilliamson文件命令获得相同的输出:xxx.c C源代码,ASCII文本,带有CR,LF行终止符。我发现此c文件的行中间有^ M,它喜欢xxxxxxx ^ M xxxxxxx
只是为了说明一下,在debian jessie上,您可能需要安装file软件包才能首先使用file命令。
在vi中...
:set list查看行尾。
:set nolist恢复正常。
虽然我认为您无法在vi中看到或
,但是您可以看到它是哪种文件类型(UNIX,DOS等),以推断它具有哪些行结尾...
:set ff
或者,可以从bash使用od -t c或仅使用od -c显示退货。
谢谢-这确实有效-现在我正在尝试告诉它 n或 r n是否在Vi中有其他开关?
不幸的是,我不认为vi可以显示这些特定字符。您可以尝试od -c ,我相信它将显示 n或 r n。
在"其价值所在"类别中,您可以通过发出grep --regex =" ^ M"来为Dos样式CRLF grep,其中^ M为CTRL + V CTRL + M。您可以通过用sed命令替换它们来删除它们。这与dos2unix基本上具有相同的作用
在vim中::set fileformat将报告unix或dos中的哪个vim认为文件行结尾在其中。您可以通过:set fileformat=unix进行更改。
在启动vi / vim时使用-b标志,然后使用:set列表查看CR(^ M)和LF($)的结尾。
@RyanBerger-好像您缺少-t。它应该是od -t c filepath,但是感谢新程序。很棒!
@RyanBerger,您应该编辑答案以包含" od -c"。我遇到的第一件事只是显示了回报。谢谢。
实用程序命令od应该是对此票证的正确答案。
请注意,由Vim推断(并由:set fileformat报告)的文件格式更倾向于报告unix,即仅当文件中的每一行以CRLF作为其行尾时才报告dos,否则将其报告为unix格式文件。如果您认为该文件可能是这些混合的行尾可憎的内容之一,则vim不能告诉您哪些行具有和哪些行具有。
在bash shell中,尝试cat -v。这应该显示Windows文件的回车符。
(这在Windows XP上通过Cygwin在rxvt中为我工作)。
编者注:cat -v可视化(CR)字符。如^M。因此,行尾
序列将在每个输出行的末尾显示为^M。 cat -e将另外可视化,即$。 (cat -et还将标签字符可视化为^I。)
@ChrisK:尝试echo -e abc
def
| cat -v,您应该在" def"之后看到^M。
我想查看文件是否具有^ M(Windows / DOS EOL),并且只有cat -v向我显示了该文件。为此+1
使用cat(GNU coreutils)8.21在14.04中没有骰子
^ M = DOS / Windows风格
Ubuntu 14.04:
简单的cat -e效果很好。
这将Unix行结束符(或LF)显示为$,而Windows行结束符(
或CRLF)显示为^M$。
也适用于OSX。好的解决方案。简单并为我工作,而被接受的答案却没有。 (注意:不是.txt文件)
在Windows上也可以使用git bash
对于macOS来说效果很好,谢谢!
M $的显示是否是复活节彩蛋/窗户扑打?
不适用于Solaris,但有人说应该可以使用
要将CR显示为较少的^M,请使用less -u或键入一次-u,然后再打开一次。
man less说:
-u or --underline-special
Causes backspaces and carriage returns to be treated as print-
able characters; that is, they are sent to the terminal when
they appear in the input.
请阐明您的答案。
您可以使用xxd显示文件的十六进制转储,并搜索" 0d0a"或" 0a"字符。
您可以按照@warriorpostman的建议使用cat -v。
使用cat(GNU coreutils)8.21在14.04中没有骰子
它适用于cat v 8.23。 Unix行尾将不打印任何额外的信息,但是DOS行尾将显示" ^ M"。
考虑到Im使用unix行尾,这肯定是Im在8.21中遇到的问题。
尝试"文件-k"
简短版本:file -k somefile.txt会告诉您。
它将为DOS / Windows行尾输出with CRLF line endings。
它将输出with LF line endings作为MAC线的结尾。
对于Linux / Unix行" CR",它将仅输出text。 (因此,如果未明确提及任何类型的line endings,则这意味着:" CR行尾"。)
长版请参见下文。
实际应用:证书编码
有时我必须检查一下PEM证书文件。
常规file的问题是:有时它试图变得太聪明/太具体了。
让我们尝试一些测验:我有一些文件。这些文件之一具有不同的行尾。哪一个?
(顺便说一句:这是我典型的"证书工作"目录之一)。
让我们尝试常规file:
$ file -- *
0.example.end.cer: PEM certificate
0.example.end.key: PEM RSA private key
1.example.int.cer: PEM certificate
2.example.root.cer: PEM certificate
example.opensslconfig.ini: ASCII text
example.req: PEM certificate request
嗯这不是在告诉我行尾。而且我已经知道这些是证书文件。我不需要"文件"来告诉我。
您还能尝试什么?
您可以使用--info开关尝试dos2unix,如下所示:
$ dos2unix --info -- *
37 0 0 no_bom text 0.example.end.cer
0 27 0 no_bom text 0.example.end.key
0 28 0 no_bom text 1.example.int.cer
0 25 0 no_bom text 2.example.root.cer
0 35 0 no_bom text example.opensslconfig.ini
0 19 0 no_bom text example.req
这样就告诉您:是的," 0.example.end.cer"必须是奇怪的人。但是那里有什么样的行尾?您是否真的知道dos2unix输出格式? (我不。)
但是幸运的是,在file中有--keep-going(或简称为-k)选项:
$ file --keep-going -- *
0.example.end.cer: PEM certificate\012- , ASCII text, with CRLF line terminators\012- data
0.example.end.key: PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer: PEM certificate\012- , ASCII text\012- data
2.example.root.cer: PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req: PEM certificate request\012- , ASCII text\012- data
优秀的!现在我们知道我们的奇数文件具有DOS(CRLF)行结尾。 (并且其他文件具有Unix(LF)行尾。在此输出中不是显式的。它是隐式的。这只是file期望"常规"文本文件的方式。)
(如果您想共享我的助记符:" L"代表" Linux"和" LF"。)
现在,让我们转换罪魁祸首,然后重试:
$ dos2unix -- 0.example.end.cer
$ file --keep-going -- *
0.example.end.cer: PEM certificate\012- , ASCII text\012- data
0.example.end.key: PEM RSA private key\012- , ASCII text\012- data
1.example.int.cer: PEM certificate\012- , ASCII text\012- data
2.example.root.cer: PEM certificate\012- , ASCII text\012- data
example.opensslconfig.ini: ASCII text\012- data
example.req: PEM certificate request\012- , ASCII text\012- data
好。现在所有证书都有Unix行尾。
进一步阅读
man file
man dos2unix
维基百科:换行符
您可以使用vim -b filename以二进制模式编辑文件,该文件将显示^ M个字符以返回回车符,并且换行符表示LF存在,表示Windows CRLF行尾。 LF表示,CR表示。请注意,当您使用-b选项时,默认情况下始终会在UNIX模式下编辑文件,如状态行中的[unix]所示,这意味着,如果添加新行,它们将以LF而不是CRLF结尾。如果在带有CRLF行尾的文件上使用不带-b的普通vim,则应该在状态行中看到[dos],并且插入的行将CRLF作为行尾。 fileformats设置的vim文档说明了复杂性。
此外,我没有足够的要点来评论Notepad ++答案,但是如果您在Windows上使用Notepad ++,请使用"查看/显示符号/显示行尾"菜单来显示CR和LF。在这种情况下,显示了LF,而对于vim,LF用新的线表示。
您可以使用命令todos filename转换为DOS结尾,并使用fromdos filename转换为UNIX行结尾。要在Ubuntu上安装软件包,请键入sudo apt-get install tofrodos。
我将输出转储到文本文件中。然后,我在记事本++中打开它,然后单击"显示所有字符"按钮。不是很优雅,但可以。
这个问题被标记为Linux,我不认为notepad ++适用于Linux。这应该适用于Windows。
notepadqq等同于Linux的notepad ++