Генерация спецсимволов

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

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

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

Генерация спецсимволов

Сообщение sedikpoll »

Генерирую текстовые строки при помощи:

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

echo -e $'\n'{a..z}


Но понадобилось также генерировать спецсимволы.
Возможно ли как то их генерировать задавая их десятичные значения (ASCII таблица)?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Генерация спецсимволов

Сообщение eddy »

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

echo -e "\0133"
[

А вообще,

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

cat chartable.c
#include <stdio.h>
#define UC unsigned char
int main(int argc, char* argv []){
UC code;
int ii,i;
printf("\n");
    if(argc > 1){
    if(isdigit(*argv[1])){
        code=(UC)atoi(argv[1]);
        printf("Code %3d is letter %c\n", code, code);
        exit (0);}
    else{
        code=(UC)*argv[1];
        printf("Char %c is %3d\n", code, code);}}
    else{
    for(i=0; i<32; i++){
        for(ii=1; ii<8; ii++){
        code=(UC)(i+ii*32);
        printf("%3d - %c\t", code, code);}
        printf("\n");}}
return 0;
}


chartable

 32 -       64 - @     96 - `    128 - ─    160 - ═    192 - ю    224 - Ю
 33 - !     65 - A     97 - a    129 - │    161 - ║    193 - а    225 - А
 34 - "     66 - B     98 - b    130 - ┌    162 - ╒    194 - б    226 - Б
 35 - #     67 - C     99 - c    131 - ┐    163 - ё    195 - ц    227 - Ц
 36 - $     68 - D    100 - d    132 - └    164 - ╓    196 - д    228 - Д
 37 - %     69 - E    101 - e    133 - ┘    165 - ╔    197 - е    229 - Е
 38 - &     70 - F    102 - f    134 - ├    166 - ╕    198 - ф    230 - Ф
 39 - '     71 - G    103 - g    135 - ┤    167 - ╖    199 - г    231 - Г
 40 - (     72 - H    104 - h    136 - ┬    168 - ╗    200 - х    232 - Х
 41 - )     73 - I    105 - i    137 - ┴    169 - ╘    201 - и    233 - И
 42 - *     74 - J    106 - j    138 - ┼    170 - ╙    202 - й    234 - Й
 43 - +     75 - K    107 - k    139 - ▀    171 - ╚    203 - к    235 - К
 44 - ,     76 - L    108 - l    140 - ▄    172 - ╛    204 - л    236 - Л
 45 - -     77 - M    109 - m    141 - █    173 - ╜    205 - м    237 - М
 46 - .     78 - N    110 - n    142 - ▌    174 - ╝    206 - н    238 - Н
 47 - /     79 - O    111 - o    143 - ▐    175 - ╞    207 - о    239 - О
 48 - 0     80 - P    112 - p    144 - ░    176 - ╟    208 - п    240 - П
 49 - 1     81 - Q    113 - q    145 - ▒    177 - ╠    209 - я    241 - Я
 50 - 2     82 - R    114 - r    146 - ▓    178 - ╡    210 - р    242 - Р
 51 - 3     83 - S    115 - s    147 - ⌠    179 - Ё    211 - с    243 - С
 52 - 4     84 - T    116 - t    148 - ■    180 - ╢    212 - т    244 - Т
 53 - 5     85 - U    117 - u    149 - ∙    181 - ╣    213 - у    245 - У
 54 - 6     86 - V    118 - v    150 - √    182 - ╤    214 - ж    246 - Ж
 55 - 7     87 - W    119 - w    151 - ≈    183 - ╥    215 - в    247 - В
 56 - 8     88 - X    120 - x    152 - ≤    184 - ╦    216 - ь    248 - Ь
 57 - 9     89 - Y    121 - y    153 - ≥    185 - ╧    217 - ы    249 - Ы
 58 - :     90 - Z    122 - z    154 -      186 - ╨    218 - з    250 - З
 59 - ;     91 - [    123 - {    155 - ⌡    187 - ╩    219 - ш    251 - Ш
 60 - <     92 - \    124 - |    156 - °    188 - ╪    220 - э    252 - Э
 61 - =     93 - ]    125 - }    157 - ²    189 - ╫    221 - щ    253 - Щ
 62 - >     94 - ^    126 - ~    158 - ·    190 - ╬    222 - ч    254 - Ч
 63 - ?     95 - _    127 -     159 - ÷    191 - ©    223 - ъ    255 - Ъ

RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Генерация спецсимволов

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

eddy писал(а):
10.05.2012 08:46

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

echo -e "\0133"
[
Небольшая поправка: это не десятичные, а восьмеричные коды.

eddy писал(а):
10.05.2012 08:46
А вообще
А вообще, раздел называется "работа в командной строке", а не "программирование".
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Генерация спецсимволов

Сообщение eddy »

t.t писал(а):
12.05.2012 12:39
Небольшая поправка: это не десятичные, а восьмеричные коды.

Тогда printf пользоваться
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
V112
Сообщения: 8

Re: Генерация спецсимволов

Сообщение V112 »

Код:

$ echo -e "\x2A" * $ echo -e "\xD0\x90" А $


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

Re: Генерация спецсимволов

Сообщение drBatty »

sedikpoll писал(а):
10.05.2012 04:09
Возможно ли как то их генерировать задавая их десятичные значения (ASCII таблица)?

нет. можно только восьмеричные и шестнадцатеричные (see man bash)
Можно в sed

$

echo | sed 's/.*/\d126/' ~



eddy писал(а):
12.05.2012 12:51
Тогда printf пользоваться

что-то не получается у меня:

$

printf "%c\n" 126 1

http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Генерация спецсимволов

Сообщение Subj »

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

for i in `seq 1 255`; do echo -en "\0`printf "%o" $i` - "; done


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

Re: Генерация спецсимволов

Сообщение drBatty »

Subj писал(а):
14.05.2012 12:44
for i in `seq 1 255`; do echo -en "\0`printf "%o" $i` - "; done

facepalm
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Генерация спецсимволов

Сообщение SLEDopit »

drBatty писал(а):
14.05.2012 11:43
что-то не получается у меня:
потому что вот так надо:

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

echo -e "\0$(printf "%o" 126)"
~
ну или вот так, если хотите с шестнацетиричной побаловаться:

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

 $ echo -e "\x$(printf "%x" 126)"
~

drBatty писал(а):
14.05.2012 13:11
facepalm
А что тут такого?
Можно, кстати, и без printf обойтись:

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

for i in $(seq 1 377|grep -v [89]); do echo -e "$i - \0$i"; done ;
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Генерация спецсимволов

Сообщение Subj »

drBatty писал(а):
14.05.2012 13:11
Subj писал(а):
14.05.2012 12:44
for i in `seq 1 255`; do echo -en "\0`printf "%o" $i` - "; done

facepalm


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

Re: Генерация спецсимволов

Сообщение drBatty »

Subj писал(а):
14.05.2012 14:14
Думаешь?

уверен :(
даже не хочется перечислять, ЧТО тут не так...
SLEDopit писал(а):
14.05.2012 13:35
А что тут такого?

а ЗАЧЕМ?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Генерация спецсимволов

Сообщение eddy »

drBatty писал(а):
14.05.2012 21:14
а ЗАЧЕМ?

ЗА ШКАФОМ!

ТЗ почитай: надо было генерировать символы по их десятичным значениям. Т.к. echo не поддерживает вывод в десятичных, надо printf использовать для преобразования десятичного кода в шестнадцатеричный или восьмеричный.
Т.е. ТСу нужно что-то вроде

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

function printCharByDecCode(){ echo -e "\0$(printf "%o" $1)"; }

И получим:

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

printCharByDecCode 240
П

И действительно:

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

chartable

 32 [0x20] -       64 [0x40] - @     96 [0x60] - `    128 [0x80] - ─    160 [0xa0] - ═    192 [0xc0] - ю    224 [0xe0] - Ю
 33 [0x21] - !     65 [0x41] - A     97 [0x61] - a    129 [0x81] - │    161 [0xa1] - ║    193 [0xc1] - а    225 [0xe1] - А
 34 [0x22] - "     66 [0x42] - B     98 [0x62] - b    130 [0x82] - ┌    162 [0xa2] - ╒    194 [0xc2] - б    226 [0xe2] - Б
 35 [0x23] - #     67 [0x43] - C     99 [0x63] - c    131 [0x83] - ┐    163 [0xa3] - ё    195 [0xc3] - ц    227 [0xe3] - Ц
 36 [0x24] - $     68 [0x44] - D    100 [0x64] - d    132 [0x84] - └    164 [0xa4] - ╓    196 [0xc4] - д    228 [0xe4] - Д
 37 [0x25] - %     69 [0x45] - E    101 [0x65] - e    133 [0x85] - ┘    165 [0xa5] - ╔    197 [0xc5] - е    229 [0xe5] - Е
 38 [0x26] - &     70 [0x46] - F    102 [0x66] - f    134 [0x86] - ├    166 [0xa6] - ╕    198 [0xc6] - ф    230 [0xe6] - Ф
 39 [0x27] - '     71 [0x47] - G    103 [0x67] - g    135 [0x87] - ┤    167 [0xa7] - ╖    199 [0xc7] - г    231 [0xe7] - Г
 40 [0x28] - (     72 [0x48] - H    104 [0x68] - h    136 [0x88] - ┬    168 [0xa8] - ╗    200 [0xc8] - х    232 [0xe8] - Х
 41 [0x29] - )     73 [0x49] - I    105 [0x69] - i    137 [0x89] - ┴    169 [0xa9] - ╘    201 [0xc9] - и    233 [0xe9] - И
 42 [0x2a] - *     74 [0x4a] - J    106 [0x6a] - j    138 [0x8a] - ┼    170 [0xaa] - ╙    202 [0xca] - й    234 [0xea] - Й
 43 [0x2b] - +     75 [0x4b] - K    107 [0x6b] - k    139 [0x8b] - ▀    171 [0xab] - ╚    203 [0xcb] - к    235 [0xeb] - К
 44 [0x2c] - ,     76 [0x4c] - L    108 [0x6c] - l    140 [0x8c] - ▄    172 [0xac] - ╛    204 [0xcc] - л    236 [0xec] - Л
 45 [0x2d] - -     77 [0x4d] - M    109 [0x6d] - m    141 [0x8d] - █    173 [0xad] - ╜    205 [0xcd] - м    237 [0xed] - М
 46 [0x2e] - .     78 [0x4e] - N    110 [0x6e] - n    142 [0x8e] - ▌    174 [0xae] - ╝    206 [0xce] - н    238 [0xee] - Н
 47 [0x2f] - /     79 [0x4f] - O    111 [0x6f] - o    143 [0x8f] - ▐    175 [0xaf] - ╞    207 [0xcf] - о    239 [0xef] - О
 48 [0x30] - 0     80 [0x50] - P    112 [0x70] - p    144 [0x90] - ░    176 [0xb0] - ╟    208 [0xd0] - п    240 [0xf0] - П
 49 [0x31] - 1     81 [0x51] - Q    113 [0x71] - q    145 [0x91] - ▒    177 [0xb1] - ╠    209 [0xd1] - я    241 [0xf1] - Я
 50 [0x32] - 2     82 [0x52] - R    114 [0x72] - r    146 [0x92] - ▓    178 [0xb2] - ╡    210 [0xd2] - р    242 [0xf2] - Р
 51 [0x33] - 3     83 [0x53] - S    115 [0x73] - s    147 [0x93] - ⌠    179 [0xb3] - Ё    211 [0xd3] - с    243 [0xf3] - С
 52 [0x34] - 4     84 [0x54] - T    116 [0x74] - t    148 [0x94] - ■    180 [0xb4] - ╢    212 [0xd4] - т    244 [0xf4] - Т
 53 [0x35] - 5     85 [0x55] - U    117 [0x75] - u    149 [0x95] - ∙    181 [0xb5] - ╣    213 [0xd5] - у    245 [0xf5] - У
 54 [0x36] - 6     86 [0x56] - V    118 [0x76] - v    150 [0x96] - √    182 [0xb6] - ╤    214 [0xd6] - ж    246 [0xf6] - Ж
 55 [0x37] - 7     87 [0x57] - W    119 [0x77] - w    151 [0x97] - ≈    183 [0xb7] - ╥    215 [0xd7] - в    247 [0xf7] - В
 56 [0x38] - 8     88 [0x58] - X    120 [0x78] - x    152 [0x98] - ≤    184 [0xb8] - ╦    216 [0xd8] - ь    248 [0xf8] - Ь
 57 [0x39] - 9     89 [0x59] - Y    121 [0x79] - y    153 [0x99] - ≥    185 [0xb9] - ╧    217 [0xd9] - ы    249 [0xf9] - Ы
 58 [0x3a] - :     90 [0x5a] - Z    122 [0x7a] - z    154 [0x9a] -      186 [0xba] - ╨    218 [0xda] - з    250 [0xfa] - З
 59 [0x3b] - ;     91 [0x5b] - [    123 [0x7b] - {    155 [0x9b] - ⌡    187 [0xbb] - ╩    219 [0xdb] - ш    251 [0xfb] - Ш
 60 [0x3c] - <     92 [0x5c] - \    124 [0x7c] - |    156 [0x9c] - °    188 [0xbc] - ╪    220 [0xdc] - э    252 [0xfc] - Э
 61 [0x3d] - =     93 [0x5d] - ]    125 [0x7d] - }    157 [0x9d] - ²    189 [0xbd] - ╫    221 [0xdd] - щ    253 [0xfd] - Щ
 62 [0x3e] - >     94 [0x5e] - ^    126 [0x7e] - ~    158 [0x9e] - ·    190 [0xbe] - ╬    222 [0xde] - ч    254 [0xfe] - Ч
 63 [0x3f] - ?     95 [0x5f] - _    127 [0x7f] -     159 [0x9f] - ÷    191 [0xbf] - ©    223 [0xdf] - ъ    255 [0xff] - Ъ
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Генерация спецсимволов

Сообщение drBatty »

eddy писал(а):
15.05.2012 00:11
ТЗ почитай: надо было генерировать символы по их десятичным значениям. Т.к. echo не поддерживает вывод в десятичных, надо printf использовать для преобразования десятичного кода в шестнадцатеричный или восьмеричный.

а зачем что-то преобразовывать printf'ом (почему не bc? тоже умеет), если это можно сделать командой sed напрямую, без преобразования?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

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

Re: Генерация спецсимволов

Сообщение drBatty »

eddy писал(а):
15.05.2012 00:11
И действительно:

подумаешь:

$

$ function pdc() { echo | sed "s/.*/\d$1/"; } $ pdc 126 ~


моё кунг-фу как всегда сильнее :tongue:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Генерация спецсимволов

Сообщение SLEDopit »

drBatty писал(а):
15.05.2012 10:56
а зачем что-то преобразовывать printf'ом (почему не bc? тоже умеет), если это можно сделать командой sed напрямую, без преобразования?
Какой провокационный вопрос. А зачем тут нужен sed, если можно напрямую напечатать через echo?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Генерация спецсимволов

Сообщение drBatty »

SLEDopit писал(а):
15.05.2012 11:04
А зачем тут нужен sed, если можно напрямую напечатать через echo?

eddy писал(а):
15.05.2012 00:11
ТЗ почитай: надо было генерировать символы по их десятичным значениям

echo десятичные не умеет, а printf(1) не умеет почему-то %c. Ну а преобразование ИМХО моветон (если можно без него).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Генерация спецсимволов

Сообщение eddy »

drBatty писал(а):
15.05.2012 10:56
eddy писал(а):
15.05.2012 00:11
ТЗ почитай: надо было генерировать символы по их десятичным значениям. Т.к. echo не поддерживает вывод в десятичных, надо printf использовать для преобразования десятичного кода в шестнадцатеричный или восьмеричный.

а зачем что-то преобразовывать printf'ом (почему не bc? тоже умеет), если это можно сделать командой sed напрямую, без преобразования?

Я sed не знаю. А echo с printf'ом знаю.

drBatty писал(а):
15.05.2012 11:33
echo десятичные не умеет, а printf(1) не умеет почему-то %c. Ну а преобразование ИМХО моветон (если можно без него).

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

Re: Генерация спецсимволов

Сообщение drBatty »

eddy писал(а):
15.05.2012 12:09
А я в самом начале на сях предлагал ☺

дык я и не против этого решения. printf(3) умеет %с, потому тоже можно. Хотя конечно по ТЗ достаточно было ASCII, потому пляски с unsigned char несколько избыточны ;) Ну и в printf(3) всё равно в int ЕМНИП преобразуется, т.ч. можно было и для не ASCII без UC обойтись. Но это всё мелочи, на самом деле.
eddy писал(а):
15.05.2012 12:09
Я sed не знаю.

ну вот - profit, теперь знаете, что sed умеет и десятичные ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Subj
Сообщения: 151
Статус: Useful
ОС: win

Re: Генерация спецсимволов

Сообщение Subj »

Ну хз, но моя не понимать почему facepalm - подобный прием часто встречается, да и sed не панацея :) . А %c и не будет работать ибо совсем другое, это в перловом printf работает (кстати с таким же успехом можно и perl вызвать вместо sed)

Получение символа по десятичному коду:

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

$ printf \\$(printf %o 65)
A


Получение десятичного кода по символу:

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

$ printf %d \'A
65
Building better software with Ada
Спасибо сказали: