【问题标题】:I need way to find all files containing odd ^M invisible characters我需要找到所有包含奇数 ^M 不可见字符的文件的方法
【发布时间】:2023-03-19 03:53:01
【问题描述】:

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

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

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

返回误报。

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

什么都不返回。

等等……等等……

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

【问题讨论】:

  • 您的目标是将\r\n 转换为\n 吗?如果是这样,简单地做dos2unix *.php会不会更容易?
  • 两者都适合我。我建议一些调试步骤:获取第一个给出误报的文件,然后尝试fgrep $'\r' /path/to/file.php | cat -v | more,看看它认为它发现了什么。对于第二个,尝试不使用grep 并查看带有 CRLF 的文件输出的文件。
  • 您是否安装了dos2unix?这可能是最简单的方法。

标签: php bash replace line-endings newline


【解决方案1】:

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

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

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

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

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

^M 是一个 Control-M。使用 Bash 或 Kornshell,您可以通过按 Control-V,然后按 Control-M 来实现。您可能必须拥有set -o vi 才能使其工作。

【讨论】:

  • 我喜欢你对 pre-commit hook 的评论!
【解决方案2】:

一点 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)

【讨论】:

    【解决方案3】:

    我倾向于使用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
    

    【讨论】:

      【解决方案4】:

      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 "{}" \;
      

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

      【讨论】:

      • @all,是的,转换它们会很有用,但是,只有在我确定它们需要转换之后,才能在将来进行转换。此外,我想写一份报告,列出所有文件,供其他开发人员在对数千个文件进行剧烈转换之前查看。
      猜你喜欢
      • 2011-09-26
      • 2020-11-15
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2013-12-27
      • 2010-10-29
      • 2021-01-25
      • 1970-01-01
      相关资源
      最近更新 更多