Bash下移除文件名中尾随的UTF-8十六进制表情符号编码
移除文件名末尾的UTF-8 URL编码表情符号
核心思路
这些尾随的表情符号编码是4字节UTF-8字符对应的URL编码(比如😍转为%f0%9f%98%8d),表现为连续的%[0-9a-fA-F]{2}格式串且位于文件名末尾。我们可以通过正则匹配并删除末尾所有这类连续编码。
可行命令示例
1. Sed 命令(GNU/BSD 通用)
使用扩展正则匹配末尾的连续URL编码片段:
# 处理单个字符串 echo "broadcast_file%f0%9f%98%8d" | sed -E 's/%[0-9a-fA-F]{2}+$//' # 批量重命名文件 for file in *; do new_name=$(echo "$file" | sed -E 's/%[0-9a-fA-F]{2}+$//') [ "$file" != "$new_name" ] && mv "$file" "$new_name" done
2. Perl 命令
Perl正则支持忽略大小写匹配,适配大小写混合的URL编码:
echo "broadcast_file%F0%9F%98%8D" | perl -pe 's/%[0-9a-f]{2}+$//i'
3. Awk 命令
通过sub函数替换末尾的目标编码:
echo "broadcast_file%f0%9f%98%8d" | awk '{sub(/%[0-9a-fA-F]{2}+$/, "")}1'
注意事项
- 上述命令仅匹配末尾的连续编码片段,不会误删文件名中间合法的URL编码(比如
%20表示空格)。 - 若需精准匹配Emoji专属UTF-8编码范围(如
U+1F600至U+1F64F),可使用更严格的正则,但仅覆盖部分Emoji,通用场景下推荐第一种方法:sed -E 's/%f0%9[0-9a-f]%[89ab][0-9a-f]%[89ab][0-9a-f]$//i'
内容的提问来源于stack exchange,提问作者JantsoP
相关产品推荐
相关产品推荐

