检查文件的约定

Rob*_*ski 4 character-encoding utilities shell-script files

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

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

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

aye*_*kat 6

检测

  • 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
  • 文件末尾的换行符:如果最后一个字符根据hexdumpxxd0a,则有一个换行符,就可以了:

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

    请注意,与此处表示的其他点不同,您希望它找到一些东西

  • 无非ascii 字符:这与“UTF-8 编码”相同,但可能更严格一些。

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

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

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

  • LF 表示行尾file没有任何选项会告诉你类似的信息

    ASCII 文本,带有 CRLF 行终止符

    对于脚本,可能如下所示:

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

定影

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

    file_encoding="$(file --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" | 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). 它应该完全满足您的需求。