LINUX.ORG.RU

printf, escape code после забоя.

 , , , ,


0

1

C

printf("%s", "string\b\nstring");
Bash
builtin printf '%b' 'string\b\nstring'
GNU Core Utilities
/usr/bin/printf '%b' 'string\b\nstring'

Дают на выходе:

string
string

\n просто для примера, аналогично и с \t например.
Если так и должно быть, то почему?

А почему так не должно быть? \b равносильно перемещению курсора влево. Если хочешь затереть символ - добавь пробел.

Black_Shadow ★★★★★ ()
Ответ на: комментарий от Black_Shadow

А почему так не должно быть?

Разве сначала не должен быть забой а потом перенос строки?

Если хочешь затереть символ - добавь пробел.

В случае с printf '%b' 'string\b\tstring' будет добвален лишний пробел, который не нужен.

unclear ()
Ответ на: комментарий от unclear

Разве сначала не должен быть забой а потом перенос строки?

Он и так есть перед переводом строки, просто символ не стирается. Считай, что \b двигает курсор на один символ влево.

В случае с printf '%b' 'string\b\tstring' будет добвален лишний пробел, который не нужен.

Я об этом:

$ builtin printf '%b' 'string\b \nstring'
strin 
string

Black_Shadow ★★★★★ ()
Последнее исправление: Black_Shadow (всего исправлений: 1)
Ответ на: комментарий от Black_Shadow

Если правильно понял, то работает это примерно так. Поправьте пожалуйста если что не так.

Тут вроде все понятно, сдвигает a на i.

printf '%b' 'string\b\b\ba\n'
string 
      ^
\b
string
     ^
\b
string
    ^
\b
string
   ^
a
strang
   ^
\n
strang
     
^
Тут не видит что сдвинуть, т.к. \n распознает как команду переноса а не как символ.
printf '%b' 'string\b\n' 
string
      ^
\b
string
     ^
\n
string
     
^
Тут сдвигает пробел, распознает (ПРОБЕЛ) как символ.
printf '%b' 'string\b \n'
string
      ^
\b
string
     ^
(ПРОБЕЛ)
strin(ПРОБЕЛ)
     ^
\n
strin

^
Могу предположить что по умолчанию если после \b нету входных данных, то сдвигается что-то вроде NUL, но вроде как и не NUL.
printf '%b' 'string\b'
string
      ^
\b
string
     ^
(NUL)
strin(NUL)
     ^

Как можно симулировать подобное поведение? Пробовал printf '%b' 'string\b\u0000\n', не работает.

unclear ()

Если так и должно быть, то почему?

Потому что терминал, в котором ты это производишь, работает по наследию печатной машинки / текстового принтера. Есть каретка, в ней знакогенератор. \b — сместить каретку влево, \t — вправо до границы в 8 символов, \r — вернуть в начало, \n — прокрутить бумагу на строку вниз (на юниксе \n эквивалентно \r\n, на других системах может быть по-другому). Одна из разниц в том, что печатная машинка/принтер не могут стереть букву, а терминал может, что и делает в случае пробела или другого неуправляющего символа. Детальнее кури доку по терминалу.

arturpub ★★ ()
Ответ на: комментарий от arturpub

\n — прокрутить бумагу на строку вниз (на юниксе \n эквивалентно \r\n, на других системах может быть по-другому)

Это что за вброс, быть может \v ?

anonymous ()
Ответ на: комментарий от anonymous

\r (13, 0x0d, CR) Carriage Return
\n (10, 0x0a, LF) Line Feed
\v не помню, неохота гуглить, но вроде vertical tab.

Еще \f Form Feed — не знаю кто как, а мой старый эпсон крутил до границы страницы.

arturpub ★★ ()

Подсказали решение с $(tput el), например так printf «string\b$(tput el)\n». А с \t это моя ошибка, не создает оно лишних пробелов.

unclear ()
Ответ на: комментарий от unclear

Я не пойму, чем тебе не нравится вариант с выводом пробела? Управляющие символы типа «\n», «\r», «\b», «\t» не влияют на уже отображённую на терминале информацию (ну за исключением скроллинга при создании новой строки). Они только двигают курсор.

Black_Shadow ★★★★★ ()
Ответ на: комментарий от Black_Shadow

Вообще у меня была идея записывать вывод отформатированный с помощью встроенного в bash printf'а что бы не плодить сущности, он довольно быстр и мне его вполне хватает для этих целей, а при записи в конфиг или базу, лишний пробел играет роль. Но похоже этому не суждено сбыться потому что то что я получаю в терминале, и то что перенаправляю выглядит совсем по другому.
https://www.linux.org.ru/forum/development/10708694

unclear ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.