如何在文本文件中找出行尾?


303

我试图在bash中使用某些东西来显示打印而不是解释的文件中的行尾。该文件是SSIS / SQL Server的转储文件,正在被Linux机器读取以进行处理。

  • 是否有内的任何开关vilessmore,等?

  • 除了看到行结束,我需要知道它是什么类型的线路末端(CRLFLF)。我如何找到答案?


1
一般提示:如果您对可以使用哪个* nix / cygwin命令有所了解,则始终可以查看其手册页以搜索可能会提供所需功能的开关。例如man less
David Rivers 2012年

Answers:


421

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

转换已转换的文件没有任何效果,因此可以安全地盲目运行(即,无需先测试格式),尽管通常适用免责声明。


9
现在有时分别将它们分别命名为“ fromdos”和“ todos”(在Ubuntu 10.4+中就是这种情况)
Jess Chadwick

3
@JessChadwick:是的,但是仅当您显式安装tofrodos软件包时,sudo apt-get install tofrodos就像-必须运行sudo apt-get install dos2unixget dos2unix和一样unix2dos
mklement0

Actully dos2unix无法完成所有工作,我认为stackoverflow.com/questions/23828554/dos2unix-doesnt-convert-m提供了最佳答案
Nathan

@nathan:什么dos2unix失败了?该问题的OP仅模糊地描述了该问题。
暂停,直到另行通知。

在dos2unix命令之前和之后的@DennisWilliamson文件命令获得相同的输出:xxx.c C源代码,ASCII文本,带有CR,LF行终止符。我发现此c文件在行中间有^ M,它喜欢xxxxxxx ^ M xxxxxxx
森(Nathan)2016年

127

vi...

:set list 查看行尾。

:set nolist 恢复正常。

虽然我认为您看不到\n\r\n中的内容vi,但您可以看到它是哪种文件类型(UNIX,DOS等),以推断它具有哪些行尾。

:set ff

或者,bash您可以使用od -t c <filename>或仅仅od -c <filename>显示退货。


26
不幸的是,我认为vi无法显示这些特定字符。您可以尝试od -c <文件名>,我相信它将显示\ n或\ r \ n。
瑞安·贝格

3
在“物有所值”类别中,您可以通过发出grep --regex =“ ^ M”(其中^ M为CTRL + V CTRL + M)来为Dos样式CRLF grep。您可以通过使用sed命令替换它们来删除它们。这与dos2unix基本上具有相同的作用
cowboydan 2012年

11
在vim中::set fileformat将报告文件的行尾在哪个unixdosvim中。您可以通过进行更改:set fileformat=unix
Victor Zamanian

5
在启动vi / vim时使用-b标志,然后使用:set列表查看CR(^ M)和LF($)的结尾。
塞缪尔

1
@RyanBerger-好像您缺少-t。应该是od -t c file/path,但是感谢您的新程序。很棒!
埃里克·福索姆

113

Ubuntu 14.04:

简单的cat -e <filename>作品就好。

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


7
也可以在OSX上使用。好的解决方案。简单并为我工作,而可接受的答案却没有。(注意:不是.txt文件)
dlsso

4
M $的显示是否是复活节彩蛋/窗户扑打?
汤姆M

不适用于Solaris,但有人说应该可以使用
Zeus

101

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

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

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


3
@ChrisK:尝试echo -e 'abc\ndef\r\n' | cat -v,您应该^M在“ def”之后看到a 。
暂停,直到另行通知。

我想查看文件是否具有^ M(Windows / DOS EOL),并且只有cat -v向我显示了该文件。为此+1
阿里

1
^ M = DOS / Windows风格
Mercury

更正:因此,行尾\ r \ n序列将显示为^ M $
Shayan

19

要显示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.

1
请阐明您的答案。
adao7000

12

尝试file然后file -kdos2unix -ih

file通常就足够了。但是对于困难的情况,请尝试file -kdosunix -ih

详细信息如下。


尝试 file -k

简短版: file -k somefile.txt会告诉您。

  • 它将with CRLF line endings为DOS / Windows行尾输出。
  • 它将输出with LF line endingsMAC线尾。
  • 对于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

嗯 这不是在告诉我行尾。而且我已经知道这些是证书文件。我不需要“文件”来告诉我。

您还能尝试什么?

您可以尝试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)行结尾。(其他文件的末尾LF是Unix()。在此输出中不是显式的。它是隐式的。这只是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行尾。

尝试 dos2unix -ih

我在编写上面的示例时不知道这一点,但是:

其实事实证明,DOS2UNIX的会给你一个标题行,如果你使用-ih(简称--info=h),像这样:

$ dos2unix -ih -- *
 DOS    UNIX     MAC  BOM       TXTBIN  FILE
   0      37       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

还有另一个“实际”时刻:标头格式确实很容易记住:这是两个助记符:

  1. 是DUMB(从左到右:d表示Dos,u表示Unix,m表示Mac,b表示BOM)。
  2. 并且:“ DUM”只是D,U和M的字母顺序。

进一步阅读


1
它生成如下输出:Accounts.java: Java source, ASCII text\012-在MinTTY的Windows上
独立运行

@standalone:有趣。我已经读过一个名为“ igncr”的选项的怪异内容,而您所说的听起来像那样。但是无法重现您的描述。(我尝试在Windows Git随附的Bash里面的薄荷味内进行“ git version 2.24.0.windows.1”。)
StackzOfZtuff

嗯,我file -k Accounts.java也在git-for-windows附带的薄荷糖中尝试过,但我的版本是git version 2.21.0.windows.1
独立运行

对我来说cat -e file_to_test
有效的

9

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

您可以cat -v <filename>按照@warriorpostman的建议使用。


1
它适用于cat v 8.23。Unix行尾将不打印任何其他信息,但是DOS行尾将显示“ ^ M”。
Rich

考虑到我使用的是Unix行尾,这肯定是我在8.21中遇到的问题。
neanderslob 2015年

5

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


5

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

另外,我没有足够的要点来注释Notepad ++的答案,但是如果您在Windows上使用Notepad ++,请使用“查看/显示符号/显示行尾”菜单来显示CR和LF。在这种情况下,显示了LF,而对于vim,LF用新的线表示。


0

我将输出转储到文本文件中。然后,我在记事本++中打开它,然后单击“显示所有字符”按钮。不是很优雅,但可以。


3
这个问题被标记为Linux,我不认为notepad ++适用于Linux。这应该适用于Windows。
里克·史密斯

0

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

如果您希望始终在vim render中看到Windows换行符^M,则可以将此行添加到您的.vimrc

set ffs=unix

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


Vim-有时显示Windows换行符

如果只希望基于每个文件进行设置,则可以:e ++ff=unix在编辑给定文件时使用。


Vim-始终显示文件类型(unixvs dos

如果你想让Vim的底线,始终显示的内容对文件类型你是编辑(和你没有力设定的文件类型为UNIX),您可以添加到您的statusline使用
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/vimrc\                                    [vim] utf-8[unix] 77% 315:6

在文件的底部


Vim-有时显示文件类型(unixvs dos

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.