it-swarm.cn

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

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

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

以上似乎与文字rn匹配,这不是所期望的。

这个输出将通过xargs传输到todos,将crlf转换为lf,就像这样

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

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

grep -IUr --color "^M"

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

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

解释

  • -I忽略二进制文件
  • -U阻止grep去除CR字符。默认情况下,如果它确定它是文本文件,它会这样做。
  • -r以递归方式读取每个目录下的所有文件。
108
pjz

grep可能不是你想要的工具。它将为每个文件中的每个匹配行打印一行。除非你想在10行文件上运行待机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
138
Thomee
46
Steven Penny

如果你的grep版本支持 -P( - Perl-regexp) option,那么

grep -lUP '\r$'

可用于。

15
Linulin
# 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
6
yabt

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

grep -P '\x0d\x0a'

找到所有行,而

grep -P '\x0d\x0d\x0a'

grep -P '\x0d\x0d'

找不到任何行,所以当涉及到行结束模式时,grep内部可能会有“else”的内容......不幸的是对我来说!

3
Peter Y

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

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

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

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

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