Как заменить все закодированные процентом подстроки UTF-8 простым текстом UTF-8?

Вы, вероятно, знаете удар встроенный 'expr' как в

$ expr 60 / 5
12

который ограничен целыми числами и нуждается в пробелах между аргументами.

Что мешает Вам определять функцию вроде выражения эха, которое Вы уже используете? Т.е.

 divide () {
   echo $1/$2 | bc
 }
9
05.12.2012, 01:32
3 ответа

С ударом, 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}

вместо этого непосредственно позади первой команды.

9
27.01.2020, 20:06
  • 1
    Обратите внимание, что это изящное решение будет работать с любым кодированием, не только UTF-8 (т.е. избавляться от кодировки для ~ и других. Другой прием для добавления к моей панели инструментов.Спасибо! –  vonbrand 26.01.2013, 04:37

С жемчугом:

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

Или с URI::Escape:

perl -MURI::Escape -pe '$_=uri_unescape$_'
5
27.01.2020, 20:06

Существует названная программа convmv который может помочь Вам.

Просто используйте convmv --unescape /some_path/target_file. Это сделает пробный прогон.

После того как Вы подтвердили, использовать convmv --notest --unescape /some_path/target_file продолжаться.

Домашняя страница этой программы: http://j3e.de/linux/convmv/

0
27.01.2020, 20:06

Теги

Похожие вопросы