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

时间:2020-03-05 18:56:22  来源:igfitidea点击:

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

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

上面的内容似乎与文字rn相匹配,这不是所希望的。

这样的输出将通过xargs传递到todos,以将crlf转换为lf,如下所示

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

解决方案

回答

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

grep -IUr --color "^M"

如果我们按照我的建议输入了一个文字CR,那么^ M就可以使用。

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

解释

  • -I忽略二进制文件
  • -U防止grep剥离CR字符。默认情况下,如果它决定是一个文本文件,它将执行此操作。
  • -r递归读取每个目录下的所有文件。

回答

grep可能不是我们想要的工具。它将为每个文件中的每个匹配行打印一行。除非我们想在10行文件中运行todo 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

回答

如果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内可能发生了"其他"事件
当涉及到行结束模式时...对我来说很不幸!