Перевод значения в символы

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

sedikpoll
Сообщения: 100

Перевод значения в символы

Сообщение sedikpoll »

Есть строка следующего содержания:

Код: Выделить всё

"char(37)+char(45)+char(125)+char(75)+char(66)"


Известно что "char(37)" соответствует значение "%", а "char(45)" соответствует "-"
т.е.

Код: Выделить всё

char(37) = %
char(45) = -
char(125) = }
char(75) = K
char(66) = B


получается что выходе мы получаем из строки "char(37)+char(45)+char(125)+char(75)+char(66)" следующие: "%-}KB"

Подскажите, пожалуйста, на примере как это (перевод) можно реализовать в виде сценария.

Заранее спасибо.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Перевод значения в символы

Сообщение drBatty »

sedikpoll писал(а):
30.03.2011 20:55
Известно что "char(37)" соответствует значение "%",

Код: Выделить всё

echo "char(37)" | sed 's/char(37)/%/'
%

дальше думайте сами ;)
удачи

можно сделать умнее и быстрее:

* echo умеет преобразовывать "\040", но в восмеричной. В десятичной не умеет. Но
* obase=8;10;20;30;40
12
24
36
50
Это bc. Видно, что он умеет 10->8

Сложить 2 и 2 сможете?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

А можно обработать эту строку так, что она превратится в ряд команд awk. awk умеет печатать ascii-символы по десятичным кодам.
Вот только я awk не осилил.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

Вот, например, как-то вот так:

awk "`echo "char(37)+char(45)+char(125)+char(75)+char(66)"|sed 's/+/;/g;s/char(\([0-9]*\))/printf "%c",\1/g;s/.*/BEGIN {&;}/'`"
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

Моя команда сильно раздута, потому что я не владею awk, часть работы переложил на sed. sed тут и не нужен.

Общий принцип следующий.
Команда awk 'BEGIN { printf "%c", 37; }' печатает символ, соответствующий коду 37. Нужно превратить исходную строку в подобие команды awk. Я использовал для этого sed.
sed 's/+/;/g' заменяет все плюсы на двоеточия.
s/char(\([0-9]*\))/printf "%c",\1/g заменяет char на printf "%c". При этом вместо \1 подставляется часть строки в скобках (числа).
Наконец, в начало добавляется BEGIN, в конец фигурная скобка. s/.*/BEGIN {&;}/ Тут .* соответствует всей строке. & — той подстроке, для которой выполняется замена, то есть, опять-таки, всей строке.

Если посмотреть на части конвейера:
$echo "char(37)+char(45)+char(125)+char(75)+char(66)" | sed 's/+/;/g;s/char(\([0-9]*\))/printf "%c",\1/g;s/.*/BEGIN {&;}/'
BEGIN {printf "%c",37;printf "%c",45;printf "%c",125;printf "%c",75;printf "%c",66;}

Вот это и есть простая команда awk.

К сожалению, я awk совсем не знаю, поэтому излишне сложное решение получилось. Так делать не нужно.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Перевод значения в символы

Сообщение /dev/random »

printf $(printf '\\x%02x' $(echo $FOO | sed 's/+\?char(\([0-9]*\))+\?/\1 /g'))

(FOO - переменная с закодированной строкой)
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

drBatty, а все ли echo такое умеют? echo, встроенная в bash умеет, echo из пакета GNU coreutils умеет, а вот ни встроенная в tcsh, ни /bin/echo в системе OpenBSD — увы нет.

awk тут, вроде, более переносимый вариант, нет?
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Перевод значения в символы

Сообщение sash-kan »

Nazyvaemykh писал(а):
30.03.2011 23:46
а вот ни встроенная в tcsh, ни /bin/echo в системе OpenBSD — увы нет
проблемы индейцев?

p.s. hint от шерифа:
#!/bin/bash
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

sash-kan, как бы самому не превратиться из шерифа в индейца.
Кроме всевозможных BSD, есть еще и набор встраиваемых систем, где никакого GNU может и не оказаться. По мне, нужно всегда отдавать себе отчет, когда делаешь что-то нестандартное, что выходит, например, за рамки POSIX.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Перевод значения в символы

Сообщение drBatty »

Nazyvaemykh писал(а):
30.03.2011 23:46
awk тут, вроде, более переносимый вариант, нет?

да. и более опасный - злоумышленнику проще будет пропихнуть свой вредоносный код в вашу смесь трёх разных языков, один из которых вы ещё и почти не знаете...


PS:

$

$ echo "char(37)+char(45)+char(125)+char(75)+char(66)" | sed -r "s/char\(([0-9]+)\)\+?/\1 /g;s/.*/printf '\x5c\x5c\x5c\x5c\x78%02x' &/e; s/.*/echo -e \x22&\x22/e" %-}KB


как-то так...

Nazyvaemykh писал(а):
30.03.2011 23:34
printf "%c",37

всё-бы ничего, но это НЕ работает. Печатается тройка.

Nazyvaemykh писал(а):
31.03.2011 15:22
где никакого GNU может и не оказаться. По мне, нужно всегда отдавать себе отчет, когда делаешь что-то нестандартное, что выходит, например, за рамки POSIX.

суть в том, что в GNU вообще нет awk, есть gawk, которая ИМХО отличается от awk намного сильнее sed & bash.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

drBatty, согласен.
Я притянул awk только потому, что не знал, что printf 1 настолько совместима с printf 3. Такое мое решение вообще не имеет смысла.

Но потенциально задача легко решается только средствами awk. Возможно, даже проще и быстрее, чем связка printf + sed.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

drBatty писал(а):
31.03.2011 15:30
Nazyvaemykh писал(а):
30.03.2011 23:34
printf "%c",37

всё-бы ничего, но это НЕ работает. Печатается тройка.

Nazyvaemykh писал(а):
31.03.2011 15:22
где никакого GNU может и не оказаться. По мне, нужно всегда отдавать себе отчет, когда делаешь что-то нестандартное, что выходит, например, за рамки POSIX.

суть в том, что в GNU вообще нет awk, есть gawk, которая ИМХО отличается от awk намного сильнее sed & bash.

Спасибо, не знал.
Проверил, что выводит awk 'BEGIN { printf "%c",37 }' на разных системах.
OpenBSD 4.7, mawk в Squeeze (1.3.3-15), gawk (3.1.8) печатают проценты.
А вот mawk в Lenny не печатает вообще ничего…
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Перевод значения в символы

Сообщение sash-kan »

Nazyvaemykh писал(а):
31.03.2011 15:22
sash-kan, как бы самому не превратиться из шерифа в индейца.
Кроме всевозможных BSD, есть еще и набор встраиваемых систем, где никакого GNU может и не оказаться. По мне, нужно всегда отдавать себе отчет, когда делаешь что-то нестандартное, что выходит, например, за рамки POSIX.
busybox должен помочь шерифу не впасть в индейство.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Перевод значения в символы

Сообщение drBatty »

Nazyvaemykh писал(а):
31.03.2011 15:34
Но потенциально задача легко решается только средствами awk. Возможно, даже проще и быстрее, чем связка printf + sed.

а в awk нету средств перевода чисел из дес. системы? Именно этого не хватает в sed...
sash-kan писал(а):
31.03.2011 17:31
busybox должен помочь шерифу не впасть в индейство.

вот ещё какая переменная есть, и действует на многие команды (например на sed) POSIXLY_CORRECT


про gawk
Variables and fields may be (floating point) numbers, or strings, or both. How the value of a variable is
interpreted depends upon its context. If used in a numeric expression, it will be treated as a number; if
used as a string it will be treated as a string.

<skip>

When a string must be converted to a number, the conversion is accomplished using strtod(3). A number is
converted to a string by using the value of CONVFMT as a format string for sprintf(3), with the numeric
value of the variable as the argument.


а про символы вообще ничего не написано. т.е., как я понимаю, printf вообще не обязана переводить числа в символы, в отличие от printf(2)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

man 1p awk, вот что написано про printf "%c":
7. For the c conversion specifier character: if the argument has a
numeric value, the character whose encoding is that value shall be
output. If the value is zero or is not the encoding of any charac‐
ter in the character set, the behavior is undefined. If the argu‐
ment does not have a numeric value, the first character of the
string value shall be output; if the string does not contain any
characters, the behavior is undefined.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Перевод значения в символы

Сообщение drBatty »

Nazyvaemykh писал(а):
31.03.2011 19:14
man 1p

это где и что это?
у меня такого нет
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

http://www.kernel.org/pub/linux/docs/man-p...an-pages-posix/
по-видимому, что-то такое. В Arch Linux это входит в пакет man-pages.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Перевод значения в символы

Сообщение t.t »

В Debian это пакет manpages-posix.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

Попробовал поосваивать awk, решение получилось довольно громоздким:
echo $FOO | awk '{ gsub(/(char\()|\)/,"");n=split($0,a,"+");for (i = 1; i <= n; i++) printf "%c",a[i]}'
проверил, работает и в GNU, и в OpenBSD.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

drBatty писал(а):
31.03.2011 17:43
Nazyvaemykh писал(а):
31.03.2011 15:34
Но потенциально задача легко решается только средствами awk. Возможно, даже проще и быстрее, чем связка printf + sed.

а в awk нету средств перевода чисел из дес. системы? Именно этого не хватает в sed...

В gawk (не awk) есть даже средства, например, для перевода в дес. систему. Вот встроенная функция strtonum:

$ echo 0x11 |awk '{ printf "%d\n", strtonum($1) }'
17
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

Можно еще вот так вот решить исходную задачку средствами awk:
$ awk "function char(a) {printf \"%c\", a}; BEGIN { $FOO }"

для безопасности можно добавить проверку соответствия исходной строки регулярному выражению…
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Перевод значения в символы

Сообщение drBatty »

Nazyvaemykh писал(а):
04.04.2011 10:05
В gawk (не awk) есть даже средства, например, для перевода в дес. систему. Вот встроенная функция strtonum:

$ echo 0x11 |awk '{ printf "%d\n", strtonum($1) }'
17

нам нужно numtochar()
что-бы numtochar(65) напечатала A.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Перевод значения в символы

Сообщение Nazyvaemykh »

drBatty, так
printf "%c", 65 печатает именно A.
Согласно POSIX.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Перевод значения в символы

Сообщение NickLion »

Код: Выделить всё

perl -e '$_=<>;s/(\d+)/print chr($1)/ge;'

как вариант

UPD
более удачные варианты:

Код: Выделить всё

perl -e 'print map{chr($_)} <>=~m/(\d+)/g'

Код: Выделить всё

perl -e 'print chr($_) foreach <>=~m/(\d+)/g'
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Перевод значения в символы

Сообщение drBatty »

Nazyvaemykh писал(а):
04.04.2011 18:52
printf "%c", 65 печатает именно A.
Согласно POSIX.

насколько я понял, только в POSIX-C. В С есть тип данных char, а вот в awk такого типа просто нет. Там есть числа и строки, а %c принимает аргумент всё-же char.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Перевод значения в символы

Сообщение /dev/random »

drBatty писал(а):
12.04.2011 19:59
Nazyvaemykh писал(а):
04.04.2011 18:52
printf "%c", 65 печатает именно A.
Согласно POSIX.

насколько я понял, только в POSIX-C. В С есть тип данных char, а вот в awk такого типа просто нет. Там есть числа и строки, а %c принимает аргумент всё-же char.

(man 1p awk) писал(а):7. For the c conversion specifier character: if the argument has a numeric value, the character whose encoding is that value shall be output. If the value is zero or is not the encoding of any character in the character set, the behavior is undefined. If the argument does not have a numeric value, the first character of the string value shall be output; if the string does not contain any characters, the behavior is undefined.

Спасибо сказали: