背景
在一个脚本中,想要把一个不安全的字符串放进文件名。需要达到几个目的:
- 空格最终转换为下划线
- 直接删除所有Ascii控制字符、路径不安全字符(如~, , / 等)
- 允许中文和所有unicode符号(也可以删除一些unicode空白符号,但是难以全部列举,而且这些字符作为文件名是安全的)
找了一些资料没有符合自己要求的。
方案
使用如下的脚本(注意需要指定#!/bin/bash
或其他shell,否则echo -n
不生效)
#!/bin/bash
original="中文 Abc%^&*\/_发表的文章"
modified=$(echo -n "$original" | tr ' ' '_' | perl -Mopen=locale -ane 's/[\x{0000}-\x{002F}\x{005B}-\x{005E}\x{0060}\x{007B}-\x{00FF}]//g; print')
echo "Original: $original"
echo "Modified: $modified"
输出结果为:
Original: 中文 Abc%^&*\/_发表的文章
Modified: 中文_Abc_发表的文章
这个命令第一步通过tr
将空格替换为_
,然后再用perl
将ascii范围的非法字符过滤掉。这个范围从ascii表中找到。
如果想要把特殊符号也转换成_
,只需要把perl中的//g
换成/_/g
即可。