我想在bash中使用某些东西来显示文件中的行尾,而不是解释它。该文件是从SSIS/SQL Server导出,由Linux机器读取进行处理。
是否有任何在
vi
、less
、more
等内部的选项?除了查看行尾之外,我还需要知道它是哪种类型的行尾(
CRLF
或LF
)。如何找到它?
我想在bash中使用某些东西来显示文件中的行尾,而不是解释它。该文件是从SSIS/SQL Server导出,由Linux机器读取进行处理。
是否有任何在vi
、less
、more
等内部的选项?
除了查看行尾之外,我还需要知道它是哪种类型的行尾(CRLF
或LF
)。如何找到它?
file
实用工具来判断文本文件的行尾类型。$ 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
将已转换的文件再次转换不会产生任何影响,因此可以放心地运行(即无需先测试格式),尽管通常的免责声明仍然适用。
sudo apt-get install tofrodos
显式安装了tofrodos
软件包时才会生效 - 就像你必须运行sudo apt-get install dos2unix
以获取dos2unix
和unix2dos
一样。 - mklement0file -bi
进行验证),因为file
会适当地命名它们,并且不会显示有关行结尾的信息;此外,OP要求打印行结尾,而不仅仅是它们的类型(LF或CRLF),因此@Alex Shelemin的答案更合适。 - Life5ignUbuntu 14.04:
使用简单的cat -e <filename>
命令即可。
此命令将Unix换行符(\n
或LF)显示为$
,将Windows换行符(\r\n
或CRLF)显示为^M$
。
.txt
文件) - dlsso^M$
中的脱字符 (^) 把它反转成了一个彩蛋,专门为微软追随者准备的。 - Bob Steincat -vE <filename>
命令来查看文件中的 \r
字符(显示为 ^M
),以及 \n
字符(显示为 $
)。这是在 Linux 上使用 GNU cat
命令。 - xmnboy在vi
中...
:set list
命令可以查看行尾标记。
:set nolist
命令可以返回普通模式。
虽然我认为在vi
中无法看到\n
或\r\n
,但是你可以查看文件类型(UNIX、DOS等)来推断它具有哪种行尾标记...
:set ff
另外,从bash
中,你可以使用od -t c <filename>
或者只使用od -c <filename>
来显示回车符。
:set fileformat
命令会报告文件行尾是 unix
还是 dos
。你可以通过命令 :set fileformat=unix
来改变行尾格式为Unix风格。 - Victor Zamanianod -t c file/path
,但还是谢谢你的新程序。运行得很好! - Eric Fossumcat -v <filename>
命令。这将显示Windows文件的回车符。cat -v
将\r
(CR)字符可视化为^M
。因此,换行符\r\n
序列将显示为每个输出行末尾的^M
。cat -e
还将可视化\n
为$
。(cat -et
还将标签字符可视化为^I
。)echo -e 'abc\ndef\r\n' | cat -v
,你会看到在 "def" 后面出现一个 ^M
字符。请注意,该命令的功能不受影响,它仅仅是表示了回车符的存在。 - Dennis Williamsonfile
,然后是file -k
,最后是dos2unix -ih
file
通常就足够了。但对于复杂的情况,请尝试使用file -k
或dos2unix -ih
。
详细信息如下。
file -k
简短版:file -k somefile.txt
将告诉您行终止符:
with CRLF line terminators
。with CR line terminators
。text
。(所以如果它没有明确提到任何类型的line terminators
,那么这意味着:"LF行终止符"。)对于额外奇怪的情况:当您有混合的行终止符时:
$ echo -ne '1\n2\r\n3\r' | file -k -
/dev/stdin: ASCII text, with CRLF, CR, LF line terminators
详细版本请见下文。
我有时需要检查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的输出格式吗?(我不知道。)
但幸运的是,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行终止符。
dos2unix -ih
我在编写上面的示例时并不知道这一点,但实际上,如果您使用-ih
(缩写为--info=h
),dos2unix会给您提供一个标题行,就像这样:
$ 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
又一个“实际”的时刻:头格式真的很容易记住:这里有两个助记符:
man file
man dos2unix
file -k Accounts.java
,但我的版本是git version 2.21.0.windows.1
。 - chill appreciatorcat -e file_to_test
。 - chill appreciator^M
在 less 中使用 less -u
或者打开 less 后键入 -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"字符。cat -v <filename>
。您可以使用命令todos文件名
将文本转换为DOS格式,使用fromdos文件名
将文本转换为UNIX格式。在Ubuntu上安装该软件包,输入sudo apt-get install tofrodos
。
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则表示为新行。
man less
。 - David Rivers