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

Mar*_*ppi 269 linux bash command-line newline line-endings

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

  • 是否有内的任何开关vi,less,more,等?

  • 除了查看行结尾之外,我还需要知道它是什么类型的行结束(CRLFLF).我怎么找到它?

Pau*_*ce. 380

您可以使用该file实用程序来指示行结尾的类型.

Unix的:

$ file testfile1.txt
testfile.txt: ASCII text
Run Code Online (Sandbox Code Playgroud)

"DOS":

$ file testfile2.txt
testfile2.txt: ASCII text, with CRLF line terminators
Run Code Online (Sandbox Code Playgroud)

要从"DOS"转换为Unix:

$ dos2unix testfile2.txt
Run Code Online (Sandbox Code Playgroud)

要从Unix转换为"DOS":

$ unix2dos testfile1.txt
Run Code Online (Sandbox Code Playgroud)

转换已经转换的文件没有任何效果,所以盲目运行是安全的(即不先测试格式),尽管通常的免责声明一如既往地适用.

  • 这些现在有时分别命名为"fromdos"和"todos"(如Ubuntu 10.4+中的情况) (8认同)
  • @JessChadwick:是的,但是只有你用`sudo apt-get install tofrodos`显式安装`tofrodos`包时 - 就像你必须运行`sudo apt-get install dos2unix`来获取`dos2unix`和`unix2dos `. (3认同)

Rya*_*ger 123

vi......

:set list 看到行尾.

:set nolist 恢复正常

虽然我认为你不能看到\n\r\n进入vi,你可以看到它是哪种类型的文件(UNIX,DOS等)来推断它有哪些行结尾...

:set ff

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

  • 不幸的是,我不认为vi可以显示那些特定的角色.您可以尝试od -c <filename>,我相信它会显示\n或\ r \n. (24认同)
  • 在vim中:`:set fileformat`将报告`unix`或`dos` vim中的哪一个认为文件的行结尾.您可以通过`:set fileformat = unix`来更改它. (11认同)
  • 启动vi/vim时使用-b标志,然后使用:set list查看CR(^ M)和LF($)结尾. (5认同)
  • 在"为了它的价值"类别中,你可以通过发出grep --regex ="^ M"grep for Dos style CRLF,其中^ M是CTRL + V CTRL + M. 您可以通过使用sed命令替换它们来删除它们.这与dos2unix基本相同 (3认同)

war*_*man 99

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

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

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

  • @ChrisK:尝试`echo -e'abc \ndef\r \n'| cat -v`你应该在"def"之后看到一个`^ M`. (3认同)
  • ^M = DOS/Windows 风格 (2认同)

Ale*_*min 94

Ubuntu 14.04:

简单的cat -e <filename>工作就好了.

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

  • 也适用于OSX.好的解决方案 简单而且为我工作,而接受的答案却没有.(注意:不是`.txt`文件) (6认同)
  • 也可以在Windows上使用git bash (3认同)
  • M $的显示是否是复活节彩蛋/窗户扑打? (3认同)
  • 我发现我必须使用“cat -vE &lt;filename&gt;”来查看“\r”字符(显示为“^M”)和“\n”字符(显示为“$”)。这是在 Linux 上使用 GNU `cat`。 (2认同)

小智 16

要将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.
Run Code Online (Sandbox Code Playgroud)

  • 请澄清你的答案。 (2认同)

Ric*_*ich 9

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

您可以使用cat -v <filename>@warriorpostman建议.


Sta*_*uff 9

试试"file -k"

我有时必须检查这个PEM证书文件.

常规的问题file -k somefile.txt在于:有时它会过于聪明/过于具体.

让我们尝试一下小测验:我有一些文件.其中一个文件具有不同的行结尾.哪一个?

(顺便说一句:这是我典型的"证书工作"目录之一.)

我们来试试吧with CRLF line endings:

$ 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
Run Code Online (Sandbox Code Playgroud)

呵呵.它没有告诉我行结尾.我已经知道那些是证书文件.我不需要"档案"来告诉我.

你还能尝试什么?

您可以尝试with LF line endings使用这样的text开关:

$ 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
Run Code Online (Sandbox Code Playgroud)

所以这告诉你:是的,"0.example.end.cer"必须是奇怪的人.但是那里有什么样的线路结尾?难道知道通过心脏的DOS2UNIX的输出格式?(我不.)

但幸运的是,有line endings(或file简称)选项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
Run Code Online (Sandbox Code Playgroud)

优秀!现在我们知道我们的奇数文件有DOS(dos2unix)行结尾.(而其他文件都有Unix(--info)行结尾.这在输出中并不明确.它是隐式的.它只是--keep-going期望"常规"文本文件的方式.)

(如果你想分享我的助记符:"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  
Run Code Online (Sandbox Code Playgroud)

好.现在所有的证书都有Unix行结尾.

进一步阅读


Zor*_*ayr 5

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


sma*_*ers 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 由一个新行表示。