Perl,用相应的chr-ed字符替换hexa文本

时间:2013-10-16 12:07:32

标签: regex perl chr

我有一个文件,其中包含由编码字符混合的长行。

%255D%252C%2522actualPage%2522%253A1%252C%2522rowPerPage%2522%253A50%257D%255D

每个编码器字符为%25xx,其中xx是ascii字符的hexa值(例如%2540 = @

我尝试了以下但没有成功

perl -pe 's/%25([0-9A-F](0-9A-F])/\x$1/' myfile.txt
perl -pe 's/%25([0-9A-F](0-9A-F])/chr($1)/' myfile.txt

你有什么线索吗?

TIA,Peyre

3 个答案:

答案 0 :(得分:3)

也许你想要的是URI::Encode。使用模块比使用正则表达式更好。

perl -MURI::Encode -nle'$u=URI::Encode->new(); print $u->decode($u->decode($_));'

输出是您的输入字符串:

],"actualPage":1,"rowPerPage":50}]

正如您将注意到的,字符串必须被解码两次,因为它已被编码两次(%25显然是百分号%)。临时产出是

%5D%2C%22actualPage%22%3A1%2C%22rowPerPage%22%3A50%7D%5D

答案 1 :(得分:2)

perl -MURI::Escape -ne'print uri_unescape(uri_unescape($_))'

答案 2 :(得分:0)

perl -pe 's/%25([0-9A-F][0-9A-F])/chr hex $1/ge' myfile.txt

输出

],"actualPage":1,"rowPerPage":50}]