如何用纯UTF-8文本替换所有百分比编码的UTF-8子字符串?


9

我有一个HTML文件,URL中包含许多%编码的UTF-8文本。

例如,“%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B”代表“ресурсы”(俄语中的“资源”)。

任务是用可读的UTF-8文本替换所有此类子字符串。

为了简化任务,我们可以考虑%文件中没有其他符号使用。字母数字可以是大写和小写。

我怀疑这可以用优雅来完成sedperlawk或东西,但不知道怎么办。

该Web应用程序似乎可以解决您粘贴到此处的文本的问题。

Answers:


9

使用bash,zsh中,GNU回声或在某些系统上的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}

而是直接在第一个命令后面。


请注意,这种优雅的解决方案将适用于所有编码,而不仅限于UTF-8(即摆脱〜和其他编码。向我的工具箱添加另一个技巧。谢谢!
vonbrand

5

使用perl:

perl -pe 's/%([0-9A-F]{2})/pack"H2",$1/gei'

或搭配URI::Escape

perl -MURI::Escape -pe '$_=uri_unescape$_'

我喜欢这个,因为我可以通过$_ gnu.org/software/bash/manual/html_node/Special-Parameters.html
Nemo

@Nemo,$_这里是perl$_,不是bash的。与该-p选项结合使用时,将对每个输入记录运行perl表达式(从没有提供参数的情况下从作为参数或stdin给出的文件中读取记录),当前记录存储在中$_。这是类似awk$0
斯特凡·查泽拉斯

0

有一个名为的程序convmv可以为您提供帮助。

只需使用convmv --unescape /some_path/target_file。它将进行空运行。

确认后,使用convmv --notest --unescape /some_path/target_file继续。

该程序的主页是:http : //j3e.de/linux/convmv/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.