我有一个 html 文件,其中 URL 中有很多 % 编码的 UTF-8 文本。
例如,“%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B”代表“ресурсы”(俄语中的“资源”)。
任务是将所有此类子字符串替换为可读的 UTF-8 文本。
%
为了简化任务,我们可以考虑文件中没有其他符号用法。字母数字可以是大写和小写。
sed
我怀疑这可以用、或其他东西来优雅地完成,perl
但awk
不知道如何做。
这个网络应用程序似乎可以用您粘贴在那里的文本来解决问题。
答案1
对于某些系统上的 bash、zsh、GNU echo 或 ksh 的某些实现,只需将echo -e
所有%
内容替换为\x
.
url_encoded_string="%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B"
temp_string=${url_encoded_string//%/\\x}
printf '%s\n' "$temp_string"
# output: \xD1\x80\xD0\xB5\xD1\x81\xD1\x83\xD1\x80\xD1\x81\xD1\x8B
echo -e "$temp_string"
# output: ресурсы
(它假设字符串本身不包含反斜杠字符,并且不是您的echo
命令支持的选项之一)
正如@JoshLee 还指出的那样,可以通过直接使用来避免“回声警告”:
printf ${url_encoded_string//%/\\x}
而不是直接在第一个命令后面。
答案2
使用 Perl:
perl -pe 's/%([0-9A-F]{2})/pack"H2",$1/gei'
或者与URI::Escape
:
perl -MURI::Escape -pe '$_=uri_unescape$_'
答案3
有一个名为的程序convmv
可以帮助您。
只需使用convmv --unescape /some_path/target_file
.它将进行一次试运行。
确认后,请使用convmv --notest --unescape /some_path/target_file
继续。
该程序的主页是:http://j3e.de/linux/convmv/