147

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

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

以上似乎与rn不想要的文字相匹配。

它的输出将通过 xargs 管道传输到 todos 以将 crlf 转换为 lf 像这样

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

9 回答 9

190

grep 可能不是您想要的工具。它将为每个文件中的每个匹配行打印一行。除非你想在一个 10 行的文件上运行 10 次 todos,否则 grep 并不是最好的方法。使用 find 在树中的每个文件上运行文件,然后对“CRLF”进行 grepping,将为每个具有 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
于 2008-09-16T16:03:28.833 回答
133

使用Ctrl+ V, Ctrl+M将文字回车字符输入到您的 grep 字符串中。所以:

grep -IUr --color "^M"

将起作用 - 如果^M您按照我的建议输入了文字 CR。

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

解释

  • -I忽略二进制文件
  • -U防止 grep 剥离 CR 字符。默认情况下,如果它决定它是一个文本文件,它就会这样做。
  • -r递归读取每个目录下的所有文件。
于 2008-09-16T15:56:03.670 回答
63

使用 RipGrep(取决于你的 shell,你可能需要引用最后一个参数):

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

https://github.com/BurntSushi/ripgrep

于 2012-11-30T10:20:28.207 回答
19

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

grep -lUP '\r$'

可用于。

于 2008-09-16T17:20:10.567 回答
11
# 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
于 2010-07-06T07:53:28.453 回答
3

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

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
于 2017-11-07T18:47:14.790 回答
3

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

dos2unix -ic /path/to/file

要递归地执行此操作,您可以使用bash'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
于 2020-05-06T08:55:28.357 回答
2

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

grep -P '\x0d\x0a'

找到所有行,而

grep -P '\x0d\x0d\x0a'

grep -P '\x0d\x0d'

找不到任何行,所以当涉及到行结束模式时,grep 内部可能会发生“其他”事情......不幸的是我!

于 2010-09-22T20:57:31.213 回答
1

如果像我一样,你的极简主义 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命令以仅查找要扫描的文件
  • 转储命令更改为od或您拥有的任何文件转储实用程序
  • 确认cut命令包含前导空格和尾随空格以及转储实用程序输出的十六进制字符
  • 转储输出限制为前 1000 个字符左右以提高效率

例如,使用od而不是dump可能对您有用:

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'
于 2011-10-10T16:26:52.320 回答