检查文件的约定

检查文件的约定

我需要一个脚本来检查并列出项目约定的所有文本文件。对于约定,我的意思是例如:

  • UTF-8编码
  • 没有尾随空格
  • 文件末尾换行
  • 没有非 ASCII 字符
  • LF 表示行结束

我不想重新发明轮子。也许有一个工具可以做到这一点。你知道一些吗?

答案1

检测

  • UTF-8编码:file通常会给你编码:

    文件 --brief --mime-encoding myfile.txt

    请注意,它可能是“us-ascii”或“utf-8”,具体取决于它是否找到某些 UTF-8 字符,因此您需要接受两者。

以下几点主要需要您将输出通过管道输入wc -l(以计算输出的行数)并检查它是否为 0。或者,如果找到某些内容,它们通常应返回 0,如果没有找到,则返回 1(在这种情况下满足您的要求):

  • 没有尾随空格:我猜这是一份工作grep

    grep -e '\s\+$' myfile.txt
  • 文件末尾换行hexdump:如果或的最后一个字符xxd0a,则有一个换行符,并且可以:

    xxd -ps myfile.txt | xxd -ps myfile.txt |尾-n 1 | grep '0a$'

    (请注意,与此处指出的其他点不同,您希望它能找到一些东西

  • 没有非 ASCII 字符:这与“UTF-8 编码”相同,只是可能更严格一些。

    如果你真的想要确保文件中只有 ASCII 字符(请参阅@Anthon 的回答),您可能需要类似的东西

    xxd -g1 myfile.txt | xxd -g1 myfile.txt |切-c 10-56 | grep '[a-f89][a-f0-9]'

    这将搜索 ASCII 范围 (0x00-0x7F) 之外的任何字符。但它不是很优雅。

  • LF 表示行结束file没有任何选项会告诉你类似的事情

    ASCII 文本,带有 CRLF 行终止符

    对于脚本,可能可以执行以下操作:

    xxd -g1 myfile.txt | xxd -g1 myfile.txt |切-c 10-56 | grep '0d'

定影

  • UTF-8编码: 有iconv (1)。本质上,它需要一个“from”编码(-f)、一个“to”编码(-t)和文件。 “to”编码可能是utf-8,而“from”编码可以使用file我帖子顶部所述的方式获得:

    file_encoding =“$(文件--brief--mime-encoding myfile.txt)”
    iconv -f "$file_encoding" -t 'utf-8' myfile.txt
  • 没有尾随空格:这是 的工作sed,尽管我更喜欢 POSIX 方式(即没有-i开关),这意味着使用printf+ ex。无论哪种方式,正则表达式都会类似于s/\s\+$//g.对于 POSIX 兼容方式:

    printf "%%s/\\s\\+\$//g\nwq\n" | printf "%%s/\\s\\+\$//g\nwq\n" | ex -s myfile.txt

    对于不符合 POSIX 的方式:

    sed -i 's/\s\+$//g' myfile.txt
  • 文件末尾换行:Unix 应用程序在保存文件时通常会在文件末尾附加缺失的换行符。要利用这一点,这有点像黑客:

    printf “wq\n” | ex -s myfile.txt

    (这实际上只会打开、保存、退出

  • 没有非 ASCII 字符:参见上面的“UTF-8编码”。

  • LF 表示行结束: 有dos2unix (1)。它应该完全满足您的需要。

答案2

您应该尝试该file命令,它已经很好地确定了有关内容的信息,尽管它不分析完整的数据文件。

如果您有一个大文件somefile,其中第一个 utf-8 字符直到最后才出现,file somefile则不会将其检测为 utf-8 文件。

相关内容