如何找出文本文件中的行尾?

2024-10-11 08:36:00
admin
原创
94
摘要:问题描述:我正在尝试使用 bash 中的某些东西来显示打印而不是解释的文件中的行尾。该文件是 Linux 计算机读取的 SSIS/SQL Server 转储文件,用于处理。vi、、less等内有开关吗more?除了查看行尾之外,我还需要知道行尾的类型(CRLF或LF)。我该如何找出答案?解决方案 1:您可以使...

问题描述:

我正在尝试使用 bash 中的某些东西来显示打印而不是解释的文件中的行尾。该文件是 Linux 计算机读取的 SSIS/SQL Server 转储文件,用于处理。

  • vi、、less等内有开关吗more

  • 除了查看行尾之外,我还需要知道行尾的类型(CRLFLF)。我该如何找出答案?


解决方案 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
^Mcat -e``
$cat -et`^I

解决方案 5:

尝试file,然后file -k,然后dos2unix -ih

file通常就足够了。但对于棘手的情况,请尝试file -kdos2unix -ih

详情如下。


尝试file -k

简短版本: file -k somefile.txt将告诉您行终止符:

  • 它将输出with CRLF line terminatorsDOS/Windows 行终止符。

  • 它将输出with CR line terminatorsMAC 线路终端器。

  • 它只会输出textLinux/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

还有另一个“实际上”的时刻:标题格式确实很容易记住:这里有两个助记符:

  1. 它很 DUMB(从左到右:d 代表 Dos、u 代表 Unix、m 代表 Mac、b 代表 BOM)。

  2. 而且:“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 - 始终显示文件类型(unixvs 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 - 有时显示文件类型(unixvs dos

如果您只想查看文件类型,可以使用:set fileformat(如果您强制设置了文件类型,则此方法无效)。它将返回unixunix 文件和dosWindows 文件。

解决方案 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
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用