如何在Linux上用grepsearch包含dos命令行结尾的文件(CRLF)?

我想在Linux上使用grepsearch包含dos结尾的文件。 像这样的东西:

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

上述似乎匹配字面rn这是不是所需的。

这个输出将通过xargs传入todos来将crlf转换为lf

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

使用Ctrl + VCtrl + M在您的grepstring中input文字回车符。 所以:

 grep -IUr --color "^M" 

将工作 – 如果^M有一个字面的CR,你input我build议。

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

说明

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

grep可能不是你想要的工具。 它将为每个文件中的每个匹配行打印一行。 除非你想在10行文件上运行10次,否则grep并不是最好的解决方法。 使用find在树中的每个文件上运行文件,然后通过“CRLF”的grep来获得每行文件的输出结果:

 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 -IUlr $'\r' 

explainhell.com – grep -IUlr

如果你的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 

查询是search…我有一个类似的问题…有人提交到版本控制混合行结束,所以现在我们有一堆0x0d 0x0d 0x0a行结束的文件。 注意

 grep -P '\x0d\x0a' 

find所有的行,而

 grep -P '\x0d\x0d\x0a' 

 grep -P '\x0d\x0d' 

发现没有行,所以当涉及到线结束模式可能有什么“其他”在grep里面进行…不幸的是我!

如果像我一样,你的极简主义unix不包括像文件命令一样的细节,而你的grepexpression式中的反斜杠只是不合作,试试这个:

 $ 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命令以仅查找要扫描的文件
  • dump命令更改为od或任何文件转储实用程序
  • 确认cut命令同时包含前导和尾随空间以及dump工具输出的hex字符
  • 转储输出限制在前1000个字符左右以提高效率

例如,像这样的东西可能会为你使用od而不是dump

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

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

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