如何在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 + V , Ctrl + M在您的grepstring中input文字回车符。 所以:
grep -IUr --color "^M"
将工作 – 如果^M
有一个字面的CR,你input我build议。
如果您需要文件列表,则还需要添加-l
选项。
说明
-
-I
忽略二进制文件 -
-U
防止grep去掉CR字符。 默认情况下,它会这样做,如果它决定它是一个文本文件。 -
-r
recursion读取每个目录下的所有文件。
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