Каков реверс эха-e?

С достаточно недавним гостем virtio ядро (2.6.38 + я думаю), измененный размер тома покажет до гостя без перезагрузки или повторного прикрепления. Иначе необходимо перезапустить гостя (или по крайней мере, xm block-detach/block-attach) для наблюдения нового пространства.

13
09.09.2014, 04:22
6 ответов

Есть много способов сделать это. Самые портативные два, о которых я знаю, это sed и od - они оба POSIX.

printf '\n\r\b\t\033[01;31m' | sed -n l

- им нравится... читать в стиле бегства - в стиле С.

OUTPUT

$
\r\b\t\033[01;31m$

od - немного более настраиваемый...

printf '\n\r\b\t\033[01;31m' |
od -v -w12 -t c -t a -A n

 \n  \r  \b  \t 033   [   0   1   ;   3   1   m
 nl  cr  bs  ht esc   [   0   1   ;   3   1   m

Если вы хотите знать, какие из этих опций можно посмотреть в man od, но я указываю, что мне нужны два типа экранировок - -t c обратные слеши и -t a именованные символы. Опция -w, используемая выше, не является POSIX-специфической.

И вот небольшая функция оболочки, которая будет порционно выводить восьмеричные значения каждого байта в своих аргументах - которые, конечно же, od можно было бы обрабатывать и с -t o:

proctal() (LC_ALL=C
    for a do while [ -n "$a" ] 
    do printf %o\\n "'$a"
    a=${a#?}; done; done)  

Это просто. Это немного сложнее. Он должен уметь делать то, что может делать реализация printf -q, специфичная для оболочки.

bsq() (set -f; export LC_ALL=C IFS=\'
    for a do q=${a##*\'}; printf \'
    [ -n "${a#"$q"}" ] &&
        printf "%s'\''" ${a%\'*}
    printf "%s'\n'''''\n" "$q"; done |
    sed -n "/'''''"'/!H;1h;//!d;$!n;x;l' |
    sed -e :n -e '/\\$/N;s/.\n//;tn
        s/\([^\\]\\\(\\\\\)*\)\([0-9]\)/\10\3/g
        s/\\\\'"''/\\\\''"'/g;s/$$//'
)

Использование строки из примера ранее с небольшим дополнением:

bsq "$(printf '\n\r\'\''b\t\033[01;31m')"

OUTPUT

'\n\r\\'\''b\t\0033[01;31m'

Это только немного отличается. Вы можете заметить, что есть дополнительная 0 и дополнительная \backslash. Это позволяет легко перевести на прочитанный или %b printf аргумент. For example:

i=0
until [ $((i=$i+1)) -gt 5 ]
do touch "\%$i$(printf 'hey\b \t;\n\033 ')"
done   #just for ugly's sake

bsq * | eval "
    printf '<%b>\n' $(tr \\n \ )
" | tee /dev/fd/2 |
sed -n l

OUTPUT

<\%1he  ;
>
<\%2he  ;
>
<\%3he  ;
>
<\%4he  ;
>
<\%5he  ;
>
<\\%1hey\b \t;$
\033 >$
<\\%2hey\b \t;$
\033 >$
<\\%3hey\b \t;$
\033 >$
<\\%4hey\b \t;$
\033 >$
<\\%5hey\b \t;$
\033 >$
7
27.01.2020, 19:52

Вы можете использовать что-то вроде,

$ cat filename
Ramesh is testing
New Line        is

Теперь вы можете сделать что-то вроде,

$ cat -A filename

Output

Ramesh is testing$
New Line ^Iis $

Еще одно общее тестирование без файлов:

$ echo Hello$'\t'world. | cat -A

Приведенная выше команда дает вывод как,

Hello^Iworld.$

Ссылки

5
27.01.2020, 19:52

При удалении переключателя -e на echo, в bash, и если опция xpg_echo не включена, она должна печатать строки как не более чем их исходный текст. Поэтому \n и \t будут отображаться так же буквально.

Пример

$ echo "hi\t\tbye\n\n"
hi\t\tbye\n\n

$ echo -e "hi\t\tbye\n\n"
hi      bye

Вы также можете использовать встроенную команду printf ksh93, zsh или bash, чтобы отыграть и это. Вывод

$ printf "%q\n" "$(echo -e "hi\t\tbye\n\nbye")"
$'hi\t\tbye\n\nbye'

(bash показан выше. Существуют некоторые вариации в зависимости от оболочки).

выдержка из help printf в bash

%q цитируйте аргумент так, чтобы его можно было повторно использовать в качестве входного аргумента оболочки

12
27.01.2020, 19:52

od -c будет печатать обычные символы как обычно, но специальные символы (табуляция, новая строка и т. Д.) И непечатаемые символы в качестве их escape-кода printf .

Итак:

$ echo -e asdf\\nghjk\\003foo | od -c -An
   a   s   d   f  \n   g   h   j   k 003   f   o   o  \n

-An сообщает od не выводить адрес.

1
27.01.2020, 19:52

Используйте команду printf . Например:

printf "Привет \ nэто моя строка

выведет

Hello
this is my line
-1
27.01.2020, 19:52

С помощью zsh, имеются (q), (qq), (qqq), (qqq) флаги расширения переменных, которые могут по-разному цитировать переменные:

$ a=$'a b\nba\bc\u00e9\0'

$ printf '%s\n' $a
a b
bcé

$ printf %s $a | od -vtc
0000000   a       b  \n   b   a  \b   c 303 251  \0
0000013

$ printf '%s\n' ${(q)a}
a\ b$'\n'ba$'\b'cé$'\0'

$ printf '%s\n' ${(qq)a}
'a b
bcé'

$ printf '%s\n' ${(qqq)a}
"a b
bcé"

$ printf '%s\n' ${(qqqq)a}
$'a b\nba\bcé\0'

$ (){local LC_ALL=C; print -r -- ${(qqqq)a}}
$'a b\nba\bc\303\251\0'

В вашем случае, вероятно, вам понадобится один из двух последних.

3
27.01.2020, 19:52

Теги

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