Perl, замените шестнадцатеричный текст на соответствующий символ chr-ed

У меня есть файл, который содержит длинные строки из текста, смешанного с закодированным символом.

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

Каждый кодировщик %25xx где xx является шестнадцатеричным значением ascii char (напр. %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

Есть ли у вас какие-либо подсказки для меня?

ТИА, Пейре

3 ответа

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

выход

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

Возможно, вы хотите 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
perl -MURI::Escape -ne'print uri_unescape(uri_unescape($_))'
Другие вопросы по тегам