我正在尝试使用bash中的某些内容向我显示打印文件中的行结尾而不是解释。该文件是来自SSIS / SQL Server的转储,由Linux机器读入以进行处理。
vi
,less
,more
等内是否有任何转换?
除了查看行尾外,我还需要知道它的行尾类型(CRLF
或LF
)。我如何找到它?
答案 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\n
或vi
,但您可以看到它是哪种类型的文件(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
序列将在每个输出行的末尾显示为^M
。 cat -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)
我有时必须检查这个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行结尾。
man file
man dos2unix
答案 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)
^M
如果您希望始终将vim渲染中的Windows换行符显示为^M
,则可以将此行添加到.vimrc
中:
set ffs=unix
这将使vim将您打开的每个文件解释为一个unix文件。由于UNIX文件的换行符为\n
,因此,换行符为\r\n
的Windows文件仍将正确渲染(由于\n
),但在{文件末尾(vim呈现^M
字符的方式。)
如果只希望基于每个文件进行设置,则可以在编辑给定文件时使用\r
。
:e ++ff=unix
与unix
)如果您希望vim的底行始终显示您正在编辑的文件类型(并且您没有强制将文件类型设置为unix),则可以使用
将其添加到dos
中
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
与unix
)如果只想查看文件的类型,可以使用dos
(如果强制设置文件类型,则此方法将无效)。对于UNIX文件,它将返回:set fileformat
,对于Windows,它将返回unix
。