Bash过滤特殊符号只允许中英文和下划线

2023-01-05  本文已影响0人  xun66

背景

在一个脚本中,想要把一个不安全的字符串放进文件名。需要达到几个目的:

  1. 空格最终转换为下划线
  2. 直接删除所有Ascii控制字符、路径不安全字符(如~, , / 等)
  3. 允许中文和所有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即可。

参考资料

  1. https://unix.stackexchange.com/a/442466
上一篇 下一篇

猜你喜欢

热点阅读