grep 查找包含 ^M (Windows 回车符)的文件

grep 查找包含 ^M (Windows 回车符)的文件

我使用 Linux。在数千个配置文件中隐藏着一个讨厌的 ^M(Windows 回车符),我必须找到它,因为它会导致服务器故障。

如何在充满配置文件的目录层次结构中找到 ^M?

我认为我无法在 bash 命令行中输入 ^M。但我在一个名为 m.txt 的文本文件中有它

答案1

grep -r $'\r' *

用于-r递归搜索和$''Bash 中的 c 风格转义。

此外,如果你确定它是一个文本文件,那么运行它应该是安全的

tr -d $'\r' < filename

删除\r文件中的所有内容。

如果您使用的是 GNU sed-i将执行就地编辑,因此您不需要将文件写回:

sed $'s/\r//' -i filename

答案2

当我尝试时,我发现它有点工作了,但打印出来的行是空白的。添加选项:

--color=never

如果您遇到此问题,我认为是颜色突出显示的转义字符干扰了字符\r

答案3

如果您的服务器没有 bash shell,另一种方法是使用-fon 选项grep,并结合包含 的准备好的文件\r

要创建文件:

$ echo -ne '\r' > /tmp/cr                    --or--                   $ printf '\r' > /tmp/cr

$ od -c /tmp/cr
0000000  \r
0000001

实际进行搜索

$ grep -f /tmp/cr *.html *.php *.asp *.whatever

或者你也可以偷懒直接输入 *,

$ grep -f /tmp/cr *

选项on用于指定包含要匹配的模式的文件,每行一个。在本例中只有一个模式。-f filenamegrep

答案4

要在行尾字符上使用 grep,我想您必须告诉 grep 该文件是二进制的。

  • -l(字母 L)仅用于打印文件名
  • -P用于 perl 正则表达式(因此\x0d转换为\r^M
grep -l --binary -P '\x0d' *

相关内容