如何在 Linux 上使用 grep 搜索包含 DOS 行尾(CRLF)的文件?
- 2024-11-06 08:35:00
- admin 原创
- 31
问题描述:
我想在 Linux 上使用 grep 搜索包含 DOS 行尾的文件。如下所示:
grep -IUr --color '
' .
以上内容似乎与文字相匹配,rn
但这并不是所需的。
其输出将通过 xargs 传输到 todos 中,将 crlf 转换为 lf,如下所示
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
解决方案 1:
grep 可能不是您想要的工具。它将为每个文件中的每行匹配行打印一行。除非您想对 10 行文件运行 10 次 todos,否则 grep 不是最佳方法。使用 find 对树中的每个文件运行 file,然后在其中搜索“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
解决方案 2:
使用Ctrl
+ V
, Ctrl
+M
在 grep 字符串中输入文字回车符。所以:
grep -IUr --color "^M"
将会起作用 - 如果^M
您按照我建议的那样输入文字 CR。
如果您想要文件列表,您-l
也需要添加该选项。
解释
-I
忽略二进制文件-U
防止 grep 删除 CR 字符。默认情况下,如果它确定它是文本文件,它会执行此操作。-r
递归读取每个目录下的所有文件。
解决方案 3:
使用RipGrep(取决于你的 shell,你可能需要引用最后一个参数):
rg -l '
'
-l, --files-with-matches
Only print the paths with at least one match.
解决方案 4:
如果你的 grep 版本支持-P (--perl-regexp)选项,那么
grep -lUP '
$'
可以使用。
解决方案 5:
# list files containing dos line endings (CRLF)
cr="$(printf "
")" # alternative to ctrl-V ctrl-M
grep -Ilsr "${cr}$" .
grep -Ilsr $'
$' . # yet another & even shorter alternative
解决方案 6:
dos2unix
有一个文件信息选项,可用于显示将要转换的文件:
dos2unix -ic /path/to/file
要以递归方式执行此操作,您可以使用bash
的globstar
选项,该选项对于当前 shell 启用shopt -s globstar
:
dos2unix -ic ** # all files recursively
dos2unix -ic **/file # files called “file” recursively
或者你也可以使用find
:
find -type f -exec dos2unix -ic {} + # all files recursively (ignoring directories)
find -name file -exec dos2unix -ic {} + # files called “file” recursively
解决方案 7:
您可以在 unix 中使用 file 命令。它为您提供文件的字符编码以及行终止符。
$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF
解决方案 8:
查询是搜索...我遇到了类似的问题...有人将混合行尾提交到版本控制中,所以现在我们有一堆带有0x0d
0x0d
0x0a
行尾的文件。请注意
grep -P 'x0dx0a'
找到所有行,而
grep -P 'x0dx0dx0a'
和
grep -P 'x0dx0d'
找不到任何行,所以当涉及到行结束模式时,grep 内部可能发生了“其他”事情......对我来说很不幸!
解决方案 9:
如果像我一样,你的极简主义 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命令以仅查找您要扫描的文件
将转储命令更改为od或任何您有的文件转储实用程序
确认cut命令包含前导空格和尾随空格以及转储实用程序输出的十六进制字符
为了提高效率,将转储输出限制为前 1000 个字符左右
例如,使用od而不是dump可能会对您有用:
od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件