Rob*_*ski 4 character-encoding utilities shell-script files
我需要一个脚本来检查和列出项目约定的所有文本文件。对于约定,我的意思是例如:
我不想重新发明轮子。也许有一个工具可以做到这一点。你知道一些吗?
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或xxd是0a,则有一个换行符,就可以了:
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). 它应该完全满足您的需求。