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