首页 文章

如何在文本文件中找到行结尾?

提问于
浏览
211

我试图在bash中使用某些东西来显示打印文件中的行结尾而不是解释 . 该文件是来自SSIS / SQL Server的转储,由Linux机器读入以进行处理 .

  • vilessmore 等内是否有任何开关?

  • 除了看到行结尾,我还需要知道它的行尾类型( CRLFLF ) . 我该如何找到它?

10 回答

  • 79

    您可以使用命令 todos filename 转换为DOS结尾,并使用 fromdos filename 转换为UNIX行结尾 . 要在Ubuntu上安装软件包,请键入 sudo apt-get install tofrodos .

  • 13

    您可以使用 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
    

    转换已经转换的文件没有任何效果,所以盲目地运行是安全的(即没有先测试格式),尽管通常的免责声明一如既往地适用 .

  • 112

    在bash shell中,尝试 cat -v <filename> . 这应该显示Windows文件的回车符 .

    (这在Windows XP上通过Cygwin在rxvt中为我工作) .

    编者注:cat -v可视化\ r(CR)字符 . 作为^ M . 因此,行结束\ r \ n序列将在每个输出行的末尾显示为^ M. cat -e将另外可视化\ n,即$ . (cat -et还会将标签字符可视化为^ I . )

  • 301

    Ubuntu 14.04:

    简单 cat -e <filename> 工作得很好 .

    这将Unix行结尾( \n 或LF)显示为 $ ,将Windows行结尾( \r\n 或CRLF)显示为 ^M$ .

  • 5

    vi ...

    :set list 看行尾 .

    :set nolist 恢复正常 .

    虽然我认为你不能在 vi 中看到 \n\r\n ,你可以看到它是哪种类型的文件(UNIX,DOS等)来推断它有哪些行结尾...

    :set ff

    或者,从 bash 起,您可以使用 od -t c <filename> 或仅使用 od -c <filename> 来显示返回值 .

  • 86

    您可以使用 xxd 显示文件的十六进制转储,并搜索"0d0a"或"0a"个字符 .

    您可以使用 cat -v <filename> 作为@warriorpostman建议 .

  • 0

    我将输出转储到文本文件 . 然后我在记事本中打开它,然后单击显示所有字符按钮 . 不是很优雅,但它的工作原理 .

  • 4

    要将CR显示为 ^M ,请少用 less -u 或键入-u一次打开 .

    man less 说:

    -u或--underline-special

    导致退格和回车被视为打印 -
    能干的人物;也就是说,它们会被发送到终端
    它们出现在输入中 .

  • 3

    您可以使用 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由新线指示 .

  • 9

    试试“file -k”

    我有时必须检查这个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

    $ 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 )行结尾 . 这在此输出中并不明确 . 它'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行结尾 .

    进一步阅读

相关问题