如何找出文本文件中的行尾?
- 2024-10-11 08:36:00
- admin 原创
- 73
问题描述:
我正在尝试使用 bash 中的某些东西来显示打印而不是解释的文件中的行尾。该文件是 Linux 计算机读取的 SSIS/SQL Server 转储文件,用于处理。
vi
、、less
等内有开关吗more
?除了查看行尾之外,我还需要知道行尾的类型(
CRLF
或LF
)。我该如何找出答案?
解决方案 1:
您可以使用该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
转换已转换的文件没有效果,因此可以安全地盲目运行(即不先测试格式),尽管通常的免责声明一如既往地适用。
解决方案 2:
Ubuntu 14.04:
简单cat -e <filename>
就可以了。
这会将 Unix 行尾(`或 LF)显示为,
$并将 Windows 行尾(
或 CRLF)显示为
^M$`。
解决方案 3:
在vi
...
:set list
查看行尾。
:set nolist
恢复正常。
虽然我认为您看不到或`,但您可以看到它是哪种类型的文件(UNIX,DOS等)以推断它具有哪些行结尾......
`vi
:set ff
或者,bash
您可以使用od -t c <filename>
或仅od -c <filename>
显示回报。
解决方案 4:
在 bash shell 中,尝试cat -v <filename>
。这应该会显示 Windows 文件的回车符。
(这对于我来说在 Windows XP 上通过 Cygwin 在 rxvt 中是有效的)。
编者注:将(CR) 字符cat -v
显示为。因此,行尾序列将在每个输出行的末尾显示为 。还将显示为 ,即。(还将显示制表符 。为。)`^M
^M
cat -e``$
cat -et`^I
解决方案 5:
尝试file
,然后file -k
,然后dos2unix -ih
file
通常就足够了。但对于棘手的情况,请尝试file -k
或dos2unix -ih
。
详情如下。
尝试file -k
简短版本: file -k somefile.txt
将告诉您行终止符:
它将输出
with CRLF line terminators
DOS/Windows 行终止符。它将输出
with CR line terminators
MAC 线路终端器。它只会输出
text
Linux/Unix 的“LF”行终止符。(因此,如果它没有明确提到任何类型line terminators
,则意味着:“LF 行终止符”。)
对于特别奇怪的情况:当您混合使用行终止符时:
`$ echo -ne '1
2
3
' | 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 输出格式吗?(我不记得。)
但幸运的是,有--keep-going
(或-k
简称)选项file
:
$ file --keep-going -- *
0.example.end.cer: PEM certificate
- , ASCII text, with CRLF line terminators
- data
0.example.end.key: PEM RSA private key
- , ASCII text
- data
1.example.int.cer: PEM certificate
- , ASCII text
- data
2.example.root.cer: PEM certificate
- , ASCII text
- data
example.opensslconfig.ini: ASCII text
- data
example.req: PEM certificate request
- , ASCII text
- data
太棒了!现在我们知道我们的奇数文件有 DOS ( CRLF
) 行终止符。(而其他文件有 Unix ( LF
) 行终止符。这在此输出中不是显式的。它是隐式的。这只是file
“常规”文本文件所期望的方式。)
(如果你想分享我的助记符:“L”代表“Linux”,“LF”代表“LF”。)
现在让我们转换罪魁祸首并再试一次:
$ dos2unix -- 0.example.end.cer
$ file --keep-going -- *
0.example.end.cer: PEM certificate
- , ASCII text
- data
0.example.end.key: PEM RSA private key
- , ASCII text
- data
1.example.int.cer: PEM certificate
- , ASCII text
- data
2.example.root.cer: PEM certificate
- , ASCII text
- data
example.opensslconfig.ini: ASCII text
- data
example.req: PEM certificate request
- , ASCII text
- 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
还有另一个“实际上”的时刻:标题格式确实很容易记住:这里有两个助记符:
它很 DUMB(从左到右:d 代表 Dos、u 代表 Unix、m 代表 Mac、b 代表 BOM)。
而且:“DUM”只是 D、U 和 M 的字母顺序。
进一步阅读
man file
man dos2unix
维基百科:换行符
解决方案 6:
要显示 CR,请^M
使用 lessless -u
或键入-
`u`once less 以打开。
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.
解决方案 7:
您可以使用xxd
显示文件的十六进制转储,并搜索“0d0a”或“0a”字符。
cat -v <filename>
您可以按照@warriorpostman的建议使用。
解决方案 8:
您可以使用命令todos filename
转换为 DOS 结尾,并fromdos filename
转换为 UNIX 行结尾。要在 Ubuntu 上安装该软件包,请键入sudo apt-get install tofrodos
。
解决方案 9:
您可以使用vim -b filename
以二进制模式编辑文件,它将显示 ^M 字符表示回车符,并且新行表示存在 LF,表示 Windows CRLF 行尾。我说的 LF 是`,CR 是
。请注意,当您使用 -b 选项时,文件将始终默认以 UNIX 模式编辑,如
[unix]状态行中所示,这意味着如果您添加新行,它们将以 LF 而不是 CRLF 结尾。如果您在以 CRLF 行尾结尾的文件上使用不带 -b 的普通 vim,您应该会看到
[dos]状态行中显示的,并且插入的行将以 CRLF 作为行尾。vim 的设置文档
fileformats`解释了复杂性。
另外,我没有足够的点数来评论 Notepad++ 的答案,但如果您在 Windows 上使用 Notepad++,请使用“查看”/“显示符号”/“显示行尾”菜单来显示 CR 和 LF。在这种情况下,会显示 LF,而对于 vim,LF 由新行表示。
解决方案 10:
我将输出转储到文本文件中。然后在记事本++中打开它,然后单击显示所有字符按钮。虽然不是很优雅,但确实有效。
解决方案 11:
Vim - 始终将 Windows 换行符显示为^M
如果你希望在 vim 中始终看到 Windows 换行符呈现为^M
,则可以将以下行添加到.vimrc
:
set ffs=unix
这将使 vim 将您打开的每个文件解释为 unix 文件。由于 unix 文件具有`作为换行符的 ,因此带有换行符 的 windows 文件
仍将正确呈现(这要归功于),但在文件末尾
将具有(这是 vim 呈现字符的方式)。
^M``
`
Vim - 有时显示 Windows 换行符
如果您只想根据每个文件进行设置,则可以:e ++ff=unix
在编辑给定文件时使用它。
Vim - 始终显示文件类型(unix
vs dos
)
如果您希望 vim 的底行始终显示您正在编辑的文件类型(并且您没有强制将文件类型设置为 unix),您可以在其中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\nset 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
在文件底部
Vim - 有时显示文件类型(unix
vs dos
)
如果您只想查看文件类型,可以使用:set fileformat
(如果您强制设置了文件类型,则此方法无效)。它将返回unix
unix 文件和dos
Windows 文件。
解决方案 12:
更具可移植性,甚至可能是 POSIX。
鉴于上述例子
$ printf "abc
def
"
abc
def
使用sed
$ printf "abc
def
" | sed -n l
abc$
def
$
使用od
$ printf "abc
def
" | od -c ## optional "-t a"
0000000 a b c
d e f
0000011
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件