代码之家  ›  专栏  ›  技术社区  ›  Tim Abell

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

  •  167
  • Tim Abell  · 技术社区  · 17 年前

    我想在Linux上用grep搜索包含DOS行尾的文件。大致如下:

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

    上述内容似乎与字面意思相匹配 rn 这不是所期望的。

    其输出将通过xargs管道传输到todos,以将crlf转换为lf,如下所示

    grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
    
    9 回复  |  直到 5 年前
        1
  •  186
  •   Thomee    17 年前

    grep可能不是你想要的工具。它将为每个文件中的每一行匹配打印一行。除非你想在一个10行的文件上运行10次todos,否则grep不是最好的方法。使用find在树中的每个文件上运行文件,然后grep遍历“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
        2
  •  131
  •   pjz    5 年前

    使用 Ctrl键 + 五、 , Ctrl键 + M 在grep字符串中输入一个回车符。因此:

    grep -IUr --color "^M"
    

    将工作-如果 ^M 按照我的建议,你输入了一个字面意义上的CR。

    如果你想要文件列表,你想添加 -l 选项也是。

    解释

    • -I 忽略二进制文件
    • -U 防止grep剥离CR字符。默认情况下,如果它确定这是一个文本文件,它就会这样做。
    • -r 递归读取每个目录下的所有文件。
        3
  •  62
  •   Zombo tliff    4 年前

    使用RipGrep(根据您的shell,您可能需要引用最后一个参数):

    rg -l \r
    
    -l, --files-with-matches
    Only print the paths with at least one match.
    

    https://github.com/BurntSushi/ripgrep

        4
  •  18
  •   sleske    12 年前

    如果您的grep版本支持 -P(--perl正则表达式) 选项,然后

    grep -lUP '\r$'
    

    可以使用。

        5
  •  10
  •   yabt    15 年前
    # 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
  •  3
  •   Murali Krishna Parimi    7 年前

    dos2unix 有一个文件信息选项,可用于显示将要转换的文件:

    dos2unix -ic /path/to/file
    

    要递归执行此操作,您可以使用 bash s globstar 选项,对于当前shell,该选项已启用 shopt -s globstar :

    dos2unix -ic **      # all files recursively
    dos2unix -ic **/file # files called “file” recursively
    

    或者,您可以使用 find 为此:

    find -type f -exec dos2unix -ic {} +            # all files recursively (ignoring directories)
    find -name file -exec dos2unix -ic {} + # files called “file” recursively
    
        7
  •  3
  •   Gerold Meisinger madalinivascu    4 年前

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

    $ file myfile
    myfile: ISO-8859 text, with CRLF line terminators
    $ file myfile | grep -ow CRLF
    CRLF  
    
        8
  •  2
  •   Zombo tliff    11 年前

    查询是搜索。我也有类似的问题。..有人提交了混合线 结尾进入版本控制,所以现在我们有一堆文件 0x0d 0x0d 0x0a 线结束。注意

    grep -P '\x0d\x0a'
    

    查找所有行,而

    grep -P '\x0d\x0d\x0a'
    

    grep -P '\x0d\x0d'
    

    找不到行,因此grep内部可能发生了“其他”事情 当涉及到行尾图案时。..对我来说很不幸!

        9
  •  1
  •   MykennaC    14 年前

    如果像我一样,你的极简主义unix不包括像 文件 命令,并在您的 正则表达式 表达式就是不合作,试试这个:

    $ 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
    

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

    • 调整 找到 仅查找要扫描的文件的命令
    • 更改 倾倒 命令到 操作系统 或者您拥有的任何文件转储实用程序
    • 确认 命令包括前导和尾随空格,以及从 倾倒 实用
    • 限制 倾倒 为了提高效率,输出到前1000个字符左右

    例如,这样的东西可能对你有用 操作系统 而不是 倾倒 :

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