如何找到文本文件中的行结尾?

时间:2010-08-25 20:36:07

标签: linux bash command-line newline line-endings

我正在尝试使用bash中的某些内容向我显示打印文件中的行结尾而不是解释。该文件是来自SSIS / SQL Server的转储,由Linux机器读入以进行处理。

  • vilessmore等内是否有任何转换?

  • 除了查看行尾外,我还需要知道它的行尾类型(CRLFLF)。我如何找到它?

11 个答案:

答案 0 :(得分:341)

您可以使用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

转换已转换的文件无效,因此盲目运行是安全的(即不先测试格式),尽管通常的免责声明一如既往地适用。

答案 1 :(得分:120)

vi ...

:set list查看换行符。

:set nolist恢复正常。

虽然我认为您无法在\n中看到\r\nvi,但您可以看到它是哪种类型的文件(UNIX,DOS等)来推断线路结束它... ...

:set ff

或者,从bash开始,您可以使用od -t c <filename>od -c <filename>来显示回报。

答案 2 :(得分:94)

在bash shell中,尝试cat -v <filename>。这应该显示Windows文件的回车符。

(这在Windows XP上通过Cygwin在rxvt中为我工作)。

编者注:cat -v可视化\r(CR)字符。为^M。因此,行结束\r\n序列将在每个输出行的末尾显示为^Mcat -e会另外显示\n,即$。 (cat -et还会将标签字符可视化为^I。)

答案 3 :(得分:85)

Ubuntu 14.04:

简单cat -e <filename>效果很好。

这将Unix行结尾(\n或LF)显示为$,将Windows行结尾(\r\n或CRLF)显示为^M$

答案 4 :(得分:13)

在较少使用private void toolStripStatusLabel1_Paint(object sender, PaintEventArgs e) { Rectangle r = e.ClipRectangle; Rectangle r2 = new Rectangle(r.X, r.Y, r.Width + 1, r.Height + 1); ControlPaint.DrawBorder3D(e.Graphics, r2 , Border3DStyle.SunkenInner); } 或输入 - u 时,将CR显示为^M

less -u说:

man less

答案 5 :(得分:9)

您可以使用xxd显示文件的十六进制转储,并搜索“0d0a”或“0a”字符。

您可以使用cat -v <filename>作为@warriorpostman建议。

答案 6 :(得分:7)

尝试“file -k”

我有时必须检查这个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

咦。它没有告诉我行结尾。我已经知道那些是证书文件。我不需要“档案”来告诉我。

你还能尝试什么?

您可以尝试使用dos2unix开关--info,如下所示:

$ 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输出格式吗? (我没有。)

但幸运的是--keep-going中有-k(或简称为file)选项:

$ 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行结尾。

进一步阅读

答案 7 :(得分:4)

您可以使用命令todos filename转换为DOS结尾,并使用fromdos filename转换为UNIX行结尾。要在Ubuntu上安装软件包,请键入sudo apt-get install tofrodos

答案 8 :(得分:4)

您可以使用vim -b filename以二进制模式编辑文件,该文件将显示用于回车的^ M个字符,并且新行表示LF存在,表示Windows CRLF行结尾。我用LF表示\n,用CR表示\r。请注意,当您使用-b选项时,默认情况下将在UNIX模式下编辑文件,如状态行中的[unix]所示,这意味着如果添加新行,它们将以LF结束,而不是CRLF。如果在带有CRLF行结尾的文件上使用普通的vim而不使用-b,则应该看到状态行中显示[dos],插入的行将CRLF作为行尾。 fileformats设置的vim文档解释了复杂性。

另外,我没有足够的观点来评论Notepad ++答案,但如果你在Windows上使用Notepad ++,请使用View / Show Symbol / Show End of Line菜单来显示CR和LF。在这种情况下显示LF,而对于vim,LF由新线表示。

答案 9 :(得分:0)

我将输出转储到文本文件中。然后我在notepad ++中打开它,然后单击show all characters按钮。不是很优雅,但它有效。

答案 10 :(得分:0)

Vim-始终将Windows换行符显示为^M

如果您希望始终将vim渲染中的Windows换行符显示为^M,则可以将此行添加到.vimrc中:

set ffs=unix

这将使vim将您打开的每个文件解释为一个unix文件。由于UNIX文件的换行符为\n,因此,换行符为\r\n的Windows文件仍将正确渲染(由于\n),但在{文件末尾(vim呈现^M字符的方式。)


Vim-有时显示Windows换行符

如果只希望基于每个文件进行设置,则可以在编辑给定文件时使用\r


Vim-始终显示文件类型(:e ++ff=unixunix

如果您希望vim的底行始终显示您正在编辑的文件类型(并且您没有强制将文件类型设置为unix),则可以使用
将其添加到dosstatusline

下面提供了我的完整状态栏。只需将其添加到您的set statusline+=\ %{&fileencoding?&fileencoding:&encoding}中即可。

.vimrc

它将呈现为

" Make statusline stay, otherwise alerts will hide it
set laststatus=2
set statusline=
set statusline+=%#PmenuSel#
set statusline+=%#LineNr#
" This says 'show filename and parent dir'
set statusline+=%{expand('%:p:h:t')}/%t
" This says 'show filename as would be read from the cwd'
" set statusline+=\ %f
set statusline+=%m\
set statusline+=%=
set statusline+=%#CursorColumn#
set statusline+=\ %y
set statusline+=\ %{&fileencoding?&fileencoding:&encoding}
set statusline+=\[%{&fileformat}\]
set statusline+=\ %p%%
set statusline+=\ %l:%c
set statusline+=\ 

位于文件底部


Vim-有时显示文件类型(.vim/vimrc\ [vim] utf-8[unix] 77% 315:6 unix

如果只想查看文件的类型,可以使用dos(如果强制设置文件类型,则此方法将无效)。对于UNIX文件,它将返回:set fileformat,对于Windows,它将返回unix