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