Mar*_*ppi 269 linux bash command-line newline line-endings
我试图在bash中使用某些东西来显示打印文件中的行结尾而不是解释.该文件是来自SSIS/SQL Server的转储,由Linux机器读入以进行处理.
是否有内的任何开关vi
,less
,more
,等?
除了查看行结尾之外,我还需要知道它是什么类型的行结束(CRLF
或LF
).我怎么找到它?
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)
转换已经转换的文件没有任何效果,所以盲目运行是安全的(即不先测试格式),尽管通常的免责声明一如既往地适用.
Rya*_*ger 123
在vi
......
:set list
看到行尾.
:set nolist
恢复正常
虽然我认为你不能看到\n
或\r\n
进入vi
,你可以看到它是哪种类型的文件(UNIX,DOS等)来推断它有哪些行结尾...
:set ff
或者,bash
您可以使用od -t c <filename>
或仅od -c <filename>
显示退货.
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
.)
Ale*_*min 94
Ubuntu 14.04:
简单的cat -e <filename>
工作就好了.
这将显示Unix行结尾(\n
或LF)$
和Windows行结尾(\r\n
或CRLF)^M$
.
小智 16
要将CR显示为^M
较少使用less -u
或类型-u较少一次打开.
man less
说:
Run Code Online (Sandbox Code Playgroud)-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.
我有时必须检查这个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行结尾.
您可以使用该命令todos filename
将其转换为DOS结尾,并fromdos filename
转换为UNIX行结尾。要在Ubuntu上安装软件包,请输入sudo apt-get install tofrodos
。
您可以使用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 由一个新行表示。