首页 文章

如何在Linux上使用grep搜索包含dos行结尾(CRLF)的文件?

提问于
浏览
103

我想在Linux上用grep搜索包含dos行结尾的文件 . 像这样的东西:

grep -IUr --color '\r\n' .

以上似乎与文字 rn 匹配,这不是所期望的 .

这个输出将通过xargs传输到todos,将crlf转换为lf,就像这样

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'

8 回答

  • 99

    使用Ctrl V,Ctrl M在grep字符串中输入文字回车符 . 所以:

    grep -IUr --color "^M"
    

    将工作 - 如果 ^M 有你按照我的建议输入的文字CR .

    如果您想要文件列表,还要添加 -l 选项 .

    Explanation

    • -I 忽略二进制文件

    • -U 阻止grep去除CR字符 . 默认情况下,如果它确定它是文本文件,它会这样做 .

    • -r 递归读取每个目录下的所有文件 .

  • 44

    grep可能不是你想要的工具 . 它将为每个文件中的每个匹配行打印一行 . 除非你想在10行文件上运行待机10次,否则grep并不是最好的方法 . 使用find在树中的每个文件上运行文件,然后点击“CRLF”,将为每个具有dos样式行结尾的文件提供一行输出:

    find . -not -type d -exec file "{}" ";" | grep CRLF
    

    会得到像你这样的东西:

    ./1/dos1.txt: ASCII text, with CRLF line terminators
    ./2/dos2.txt: ASCII text, with CRLF line terminators
    ./dos.txt: ASCII text, with CRLF line terminators
    
  • 3
  • 132

    如果你的grep版本支持 -P (--perl-regexp) 选项,那么

    grep -lUP '\r$'
    

    可用于 .

  • 1
    # list files containing dos line endings (CRLF)
    
    cr="$(printf "\r")"    # alternative to ctrl-V ctrl-M
    
    grep -Ilsr "${cr}$" . 
    
    grep -Ilsr $'\r$' .   # yet another & even shorter alternative
    
  • 6

    查询是搜索...我有一个类似的问题...有人提交了混合行结尾到版本控件,所以现在我们有一堆文件 0x0d 0x0d 0x0a 行结尾 . 注意

    grep -P '\x0d\x0a'
    

    找到所有的行,而

    grep -P '\x0d\x0d\x0a'
    

    grep -P '\x0d\x0d'
    

    找不到任何行,所以当涉及到行结束模式时,grep内部可能会有“其他”的东西......不幸的是对我来说!

  • 14

    如果像我一样,你的极简主义unix不包含像 file 命令这样的细节,并且 grep 表达式中的反斜杠只是不合作,试试这个:

    $ for file in `find . -type f` ; do
    > dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
    > if [ $? -eq 0 ] ; then echo $file ; fi
    > done
    

    您可能要对上述内容进行的修改包括:

    • 调整 find 命令以仅查找要扫描的文件

    • dump 命令更改为 od 或您拥有的任何文件转储实用程序

    • 确认 cut 命令同时包含前导和尾随空格以及 dump 实用程序的十六进制字符输出
      为了提高效率,

    • dump 输出限制为前1000个字符左右

    例如,像这样的东西可能适合你使用 od 而不是 dump

    od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'
    
  • 1

    您可以在unix中使用file命令 . 它为您提供文件的字符编码以及行终止符 .

    $ file myfile
    myfile: ISO-8859 text, with CRLF line terminators
    $ file myfile | grep -ow CRLF
    CRLF
    

相关问题