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

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

上面的内容似乎与字面意思相匹配 rn 这不是我们想要的。

其输出将通过 xargs 传送到 todos,以将 crlf 转换为 lf,如下所示

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
有帮助吗?

解决方案

使用 控制键+V, 控制键+中号 在 grep 字符串中输入文字回车符。所以:

grep -IUr --color "^M"

会起作用 - 如果 ^M 您按照我的建议输入了一个文字 CR。

如果您想要文件列表,则需要添加 -l 选项也是如此。

解释

  • -I 忽略二进制文件
  • -U 防止 grep 去除 CR 字符。默认情况下,如果它确定它是一个文本文件,它就会执行此操作。
  • -r 递归读取每个目录下的所有文件。

其他提示

grep 可能不是您想要的工具。它将为每个文件中的每个匹配行打印一行。除非您想在 10 行文件上运行 todos 10 次,否则 grep 并不是最好的方法。使用 find 在树中的每个文件上运行 file,然后通过 grep 查找“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 -IUlr $'\r'

explainshell.com-grep-IUlr

如果您的 grep 版本支持 -P(--perl-正则表达式) 选项,那么

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'

找不到线条,因此在线路结束模式方面可能会有一些“其他”。对我来说不幸的是!

如果像我一样,你的极简主义 unix 不包含像 文件 命令和反斜杠 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

您可能想要对上述内容进行的修改包括:

  • 调整 寻找 命令仅查找您要扫描的文件
  • 改变 倾倒 命令到 OD 或您拥有的任何文件转储实用程序
  • 确认 命令包含前导空格和尾随空格以及仅从 倾倒 公用事业
  • 限制 倾倒 为了提高效率,输出到前 1000 个字符左右

例如,这样的东西可能适合您使用 OD 代替 倾倒:

 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  
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top