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

我想在 Linux 上搜索包含以 grep 结尾的 DOS 行的文件:

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

上面的内容似乎与字面 rn相匹配,而字面 rn并不是我们想要的。

这个输出将通过 xargs 通过管道传输到 todos,以便像这样将 crff 转换为 lf

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
112235 次浏览

使用 Ctrl + VCtrl + M在 grep 字符串中输入一个返回字符,如下:

grep -IUr --color "^M"

将工作-如果 ^M有一个字面 CR,你输入我建议。

如果需要文件列表,还需要添加 -l选项。

解释

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

Grep 可能不是您需要的工具。它将为每个文件中的每个匹配行打印一行。除非您想在一个10行的文件中运行 todos 10次,否则 grep 不是最好的方法。使用 find 在树中的每个文件上运行 file,然后通过对“ CRLF”的搜索,将为每个具有 dos 样式行结尾的文件获得一行输出:

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

will get you something like:

./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

如果您的 grep 版本支持 - P (—— perl-regexp)选项,则

grep -lUP '\r$'

可以利用。

# 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

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

grep -P '\x0d\x0a'

找到所有的线,然而

grep -P '\x0d\x0d\x0a'

还有

grep -P '\x0d\x0d'

找不到行,因此 grep 内部可能存在“ else” 当谈到行结束模式... 对我来说很不幸!

如果像我一样,你的极简主义 Unix 没有包含像 文件命令这样的细节,而且 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

您可能需要对以上内容作出的修改包括:

  • 调整 找到命令,只定位要扫描的文件
  • 扔掉命令更改为 老天或您拥有的任何文件转储实用程序
  • 确认 命令包含前导空格和尾随空格以及来自 扔掉实用程序的十六进制字符输出
  • 为了提高效率,将 扔掉输出限制在前1000个字符左右

例如,这样的东西可能适合你使用 老天而不是 扔掉:

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

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

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

Https://github.com/burntsushi/ripgrep

你可以在 unix 中使用 file 命令,它提供了文件的字符编码和行结束符。

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

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

dos2unix -ic /path/to/file

要递归地做到这一点,可以使用 bashglobstar选项,对于当前 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