我试图在bash中使用某些东西来显示打印文件中的行结尾而不是解释 . 该文件是来自SSIS / SQL Server的转储,由Linux机器读入以进行处理 .
vi , less , more 等内是否有任何开关?
vi
less
more
除了看到行结尾,我还需要知道它的行尾类型( CRLF 或 LF ) . 我该如何找到它?
CRLF
LF
您可以使用命令 todos filename 转换为DOS结尾,并使用 fromdos filename 转换为UNIX行结尾 . 要在Ubuntu上安装软件包,请键入 sudo apt-get install tofrodos .
todos filename
fromdos filename
sudo apt-get install tofrodos
您可以使用 file 实用程序来指示行结尾的类型 .
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
转换已经转换的文件没有任何效果,所以盲目地运行是安全的(即没有先测试格式),尽管通常的免责声明一如既往地适用 .
在bash shell中,尝试 cat -v <filename> . 这应该显示Windows文件的回车符 .
cat -v <filename>
(这在Windows XP上通过Cygwin在rxvt中为我工作) .
编者注:cat -v可视化\ r(CR)字符 . 作为^ M . 因此,行结束\ r \ n序列将在每个输出行的末尾显示为^ M. cat -e将另外可视化\ n,即$ . (cat -et还会将标签字符可视化为^ I . )
Ubuntu 14.04:
简单 cat -e <filename> 工作得很好 .
cat -e <filename>
这将Unix行结尾( \n 或LF)显示为 $ ,将Windows行结尾( \r\n 或CRLF)显示为 ^M$ .
\n
$
\r\n
^M$
在 vi ...
:set list 看行尾 .
:set list
:set nolist 恢复正常 .
:set nolist
虽然我认为你不能在 vi 中看到 \n 或 \r\n ,你可以看到它是哪种类型的文件(UNIX,DOS等)来推断它有哪些行结尾...
:set ff
或者,从 bash 起,您可以使用 od -t c <filename> 或仅使用 od -c <filename> 来显示返回值 .
bash
od -t c <filename>
od -c <filename>
您可以使用 xxd 显示文件的十六进制转储,并搜索"0d0a"或"0a"个字符 .
xxd
您可以使用 cat -v <filename> 作为@warriorpostman建议 .
我将输出转储到文本文件 . 然后我在记事本中打开它,然后单击显示所有字符按钮 . 不是很优雅,但它的工作原理 .
要将CR显示为 ^M ,请少用 less -u 或键入-u一次打开 .
^M
less -u
man less 说:
man less
-u或--underline-special
导致退格和回车被视为打印 -能干的人物;也就是说,它们会被发送到终端它们出现在输入中 .
您可以使用 vim -b filename 以二进制模式编辑文件,该文件将显示^ M个字符以便回车,并且新行表示LF存在,表示Windows CRLF行结尾 . 通过LF我的意思是 \n 而CR我的意思是 \r . 请注意,当您使用-b选项时,默认情况下将在UNIX模式下编辑文件,如状态行中的 [unix] 所示,这意味着如果添加新行,它们将以LF结尾,而不是CRLF . 如果在带有CRLF行结尾的文件上使用普通的vim而不使用-b,则应该看到状态行中显示 [dos] ,插入的行将CRLF作为行尾 . fileformats 设置的vim文档解释了复杂性 .
vim -b filename
\r
[unix]
[dos]
fileformats
此外,我没有足够的点来评论记事本答案,但如果您在Windows上使用记事本,请使用查看/显示符号/显示行结束菜单来显示CR和LF . 在这种情况下显示LF,而对于vim,LF由新线指示 .
我有时必须检查这个PEM证书文件 .
常规 file 的问题在于:有时候它会过于聪明/过于具体 .
让我们尝试一下小测验:我有一些文件 . 其中一个文件具有不同的行结尾 . 哪一个?
(顺便说一句:这是我典型的"certificate work"目录之一 . )
让我们试试 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
呵呵 . 它没有告诉我行结尾 . 我已经知道那些是证书文件 . 我不需要"file"告诉我 .
你还能尝试什么?
您可以像这样使用 --info 开关尝试 dos2unix :
--info
dos2unix
$ 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 )选项:
--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 )行结尾 . 这在此输出中并不明确 . 它's implicit. It'只是 file 期望"regular"文本文件的方式 . )
(如果你想分享我的助记符:"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
维基百科:Newline
10 回答
您可以使用命令
todos filename
转换为DOS结尾,并使用fromdos filename
转换为UNIX行结尾 . 要在Ubuntu上安装软件包,请键入sudo apt-get install tofrodos
.您可以使用
file
实用程序来指示行结尾的类型 .Unix的:
“DOS”:
要从“DOS”转换为Unix:
要从Unix转换为“DOS”:
转换已经转换的文件没有任何效果,所以盲目地运行是安全的(即没有先测试格式),尽管通常的免责声明一如既往地适用 .
在bash shell中,尝试
cat -v <filename>
. 这应该显示Windows文件的回车符 .(这在Windows XP上通过Cygwin在rxvt中为我工作) .
编者注:cat -v可视化\ r(CR)字符 . 作为^ M . 因此,行结束\ r \ n序列将在每个输出行的末尾显示为^ M. cat -e将另外可视化\ n,即$ . (cat -et还会将标签字符可视化为^ I . )
Ubuntu 14.04:
简单
cat -e <filename>
工作得很好 .这将Unix行结尾(
\n
或LF)显示为$
,将Windows行结尾(\r\n
或CRLF)显示为^M$
.在
vi
...:set list
看行尾 .:set nolist
恢复正常 .虽然我认为你不能在
vi
中看到\n
或\r\n
,你可以看到它是哪种类型的文件(UNIX,DOS等)来推断它有哪些行结尾...:set ff
或者,从
bash
起,您可以使用od -t c <filename>
或仅使用od -c <filename>
来显示返回值 .您可以使用
xxd
显示文件的十六进制转储,并搜索"0d0a"或"0a"个字符 .您可以使用
cat -v <filename>
作为@warriorpostman建议 .我将输出转储到文本文件 . 然后我在记事本中打开它,然后单击显示所有字符按钮 . 不是很优雅,但它的工作原理 .
要将CR显示为
^M
,请少用less -u
或键入-u一次打开 .man less
说:导致退格和回车被视为打印 -
能干的人物;也就是说,它们会被发送到终端
它们出现在输入中 .
您可以使用
vim -b filename
以二进制模式编辑文件,该文件将显示^ M个字符以便回车,并且新行表示LF存在,表示Windows CRLF行结尾 . 通过LF我的意思是\n
而CR我的意思是\r
. 请注意,当您使用-b选项时,默认情况下将在UNIX模式下编辑文件,如状态行中的[unix]
所示,这意味着如果添加新行,它们将以LF结尾,而不是CRLF . 如果在带有CRLF行结尾的文件上使用普通的vim而不使用-b,则应该看到状态行中显示[dos]
,插入的行将CRLF作为行尾 .fileformats
设置的vim文档解释了复杂性 .此外,我没有足够的点来评论记事本答案,但如果您在Windows上使用记事本,请使用查看/显示符号/显示行结束菜单来显示CR和LF . 在这种情况下显示LF,而对于vim,LF由新线指示 .
试试“file -k”
我有时必须检查这个PEM证书文件 .
常规
file
的问题在于:有时候它会过于聪明/过于具体 .让我们尝试一下小测验:我有一些文件 . 其中一个文件具有不同的行结尾 . 哪一个?
(顺便说一句:这是我典型的"certificate work"目录之一 . )
让我们试试
file
:呵呵 . 它没有告诉我行结尾 . 我已经知道那些是证书文件 . 我不需要"file"告诉我 .
你还能尝试什么?
您可以像这样使用
--info
开关尝试dos2unix
:所以这告诉你:是的,"0.example.end.cer"必须是奇怪的人 . 但是那里有什么样的线路结尾?你知道dos2unix的输出格式吗? (我不 . )
但幸运的是
file
中有--keep-going
(或简称-k
)选项:优秀!现在我们知道我们的奇数文件有DOS(
CRLF
)行结尾 . (而其他文件有Unix(LF
)行结尾 . 这在此输出中并不明确 . 它's implicit. It'只是file
期望"regular"文本文件的方式 . )(如果你想分享我的助记符:"L"适用于"Linux"和"LF" . )
现在让我们转换罪魁祸首再试一次:
好 . 现在所有证书都有Unix行结尾 .
进一步阅读
man file
man dos2unix
维基百科:Newline