我想要从文件名中去掉转义字符,以下是一些例子:
=Web_Help_Desk_Pro%26Lite.pdf
=Windows_7_%2b_s-drev.pdf
会变成
=Web_Help_Desk_ProLite.pdf
=Windows_7__s-drev.pdf
有人知道如何使用Perl或BASH实现此功能吗?
$file
是你的文件名:my $file = '=Web_Help_Desk_Pro%26Lite.pdf';
$file =~ s/%[0-9a-f]{2}//gi;
%
。仅需移除百分号和后面的两个十六进制数字:
$path =~ s/%[\da-f][\da-f]//gi;
这应该可以工作
sed 's/%[[:alnum:]]\{2\}//g' INPUT_FILE
alnum
匹配了 101,959 个不同的字符,而不是应该匹配的 22 个字符。 - ikegamised
中可能会少一些,但肯定比所需的 22 多。 - ikegami在您的所有帮助下,我想出了
for f in $(find . -name \*.html); do
mv $f $(echo $f | sed 's/%[a-z0-9][a-z0-9]//gi')
done
试试这个:
rename 's/\r//' *.html
s/%[0-9a-f]{2}//ig
不就可以做到这个吗?因为你似乎不是想解码它们,只是想去掉它们。 - derobertrename
脚本:在shell提示符下键入rename 's/%[0-9a-f]{2}//ig' file1 file2…
。当然,您可以使用shell glob(例如,dir/*
)或任何其他通常在shell中构建文件列表的方式(find | xargs等)。 - derobertrename
的 Perl 包是什么吗?我所使用的rename
来自于util-linux-2.20.1-2.1.fc16.x86_64
。 - Sandra Schlichting