1

我知道这些 PHP 文件存在的事实。我可以在 VIM 中打开它们并查看有问题的字符。

我在 stackoverflow 上找到了几个链接,这些链接建议了对此的补救措施,但它们都不能正常工作。我知道几个文件不包含 ^M 字符(CRLF 行结尾)的事实,但是我不断收到误报。

find . -type f -name "*.php" -exec fgrep -l $'\r' "{}" \;

返回误报。

find . -not -type d -name "*.php" -exec file "{}" ";" | grep CRLF

什么都不返回。

等等……等等……

编辑:是的,我在有问题的目录中执行这些行。

4

4 回答 4

1

您是否使用源代码控制存储库来存储文件?他们中的许多人能够自动确保文件的行尾在提交时是正确的。我可以给你一个 Subversion 的例子。

我有一个预提交钩子,它允许我指定 Subversion 中的哪些属性必须在哪些文件上才能提交这些文件。例如,我可以指定任何以结尾的文件都*.php必须将属性svn:eol-style设置为LF.

如果您使用它,您将永远不会再遇到^M行尾问题。

至于找到它们,我已经能够做到这一点:

$ find . -type f -exec egrep -l "^M$" {} \;

^MControl-M在哪里。使用 Bash 或 Kornshell,您可以通过按 Control-V,然后按 Control-M 来实现。你可能必须set -o vi让它工作。

于 2011-11-03T17:50:40.243 回答
1

一点 Perl 不仅可以显示文件,还可以根据需要更改它们。要找到罪魁祸首,请执行以下操作:

find . -type f -name "*.php" -exec perl -ne 'print $ARGV if m{\r$}' {} + > badstuff

现在,如果你想删除讨厌的回车:

perl -pe 's{\r$}{}' $(<badstuff)

...这消除了所有受影响文件的回车。如果您想这样做并创建备份副本,请执行以下操作:

perl -pi.old -e 's{\r$}{}' $(<badstuff)
于 2011-11-03T19:07:29.920 回答
0

file命令将告诉您它看到了哪些类型的行尾字符:

$ file to-do.txt
to-do.txt: ASCII text, with CRLF line terminators
$ file mixed.txt
mixed.txt: ASCII text, with CRLF, LF line terminators

所以你可以运行例如

find . -type f -name "*.php" -exec file "{}" \; | grep -c CRLF

计算至少有一些 CRLF 行结尾的文件的数量。

您也可以使用dos2unixfromdos将它们全部转换为 LF:

find . -type f -name "*.php" -exec dos2unix "{}" \;

您可能还关心这些工具是否会触及所有文件,或者只是那些必须转换的文件;检查工具文档

于 2011-11-03T17:28:51.947 回答
0

我倾向于使用http://kb.iu.edu/data/agiz.html提供的说明来执行此操作。以下将特定文件中的 ^M 更改为 \n 返回并使用 tr 将其放入新文件中:

 tr '\r' '\n' < macfile.txt > unixfile.txt

这只是使用 perl 来做同样的事情。有了这个,您可能可以输入一系列文件:

  perl -p -e 's/\r/\n/g'  < macfile.txt > unixfile.txt
于 2011-11-03T17:35:45.413 回答