我需要一个脚本来检查并列出项目约定的所有文本文件。对于约定,我的意思是例如:
- 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
:如果或的最后一个字符xxd
是0a
,则有一个换行符,并且可以: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 文件。