заголовок на каждой странице для каждого человека

Когда вы нажимаете Ctrl + X , эмулятор терминала записывает байт 0x18 на главную сторону пары псевдотерминалов.

Что происходит дальше, зависит от того, как действует дисциплина tty-линии (программный модуль в ядре, который находится между ведущей стороной (под управлением эмулятора) и ведомой стороной (с какими приложениями, работающими в терминале, взаимодействуют)). настроен.

Команда для настройки этой дисциплины линии tty - это команда stty .

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

Некоторые интерактивные приложения, которым требуется нечто большее, чем простой строковый редактор , обычно изменяют эти настройки при запуске и восстанавливают их при выходе. Современные оболочки в их приглашении являются примерами таких приложений. Они реализуют свой собственный, более продвинутый редактор строк.

Обычно, когда вы вводите командную строку, оболочка переводит дисциплину линии tty в этот режим, а когда вы нажимаете клавишу ввода для запуска текущей команды, оболочка восстанавливает нормальный режим tty (как это было до выдачи приглашения ).

Если вы запустите команду stty -a , вы увидите текущие настройки, используемые для немых приложений . Вероятно, вы увидите, что настройки icanon , echo и echoctl включены.

Это означает, что:

  • icanon : этот грубый редактор строк включен.
  • echo : символы, которые вы вводите (которые эмулятор терминала записывает на главную сторону), возвращаются назад (становятся доступными для чтения эмулятором терминала).
  • echoctl : вместо повторения asis, управляющие символы отражаются как ^ X .

Допустим, вы набираете A B Backspace-aka-Ctrl + H /? C Ctrl + X Backspace Return .

Ваш эмулятор терминала отправит: AB \ bC \ x18 \ b \ r . Дисциплина линии будет эхом назад: AB \ b \ bC ^ X \ b \ b \ b \ b \ r \ n , и приложение, которое считывает ввод со стороны ведомого ( / dev / pts / x ) будет читать AC \ n .

Все, что видит приложение, это AC \ n , и только когда вы нажимаете Enter , чтобы оно не могло контролировать вывод для ^ X там.

Вы заметите, что для echo первый ^ H ( ^? с некоторыми терминалами, см. Параметр erase ) привел к отправке \ b \ b обратно на терминал. Это последовательность для перемещения курсора назад, перезаписи пробелом, перемещения курсора снова, в то время как второй ^ H привел к \ b \ b \ b \ b , чтобы удалить эти два ^ и X символов.

Сам ^ X (0x18) переводился в ^ и X для вывода. Как и B , он не попал в приложение, так как мы удалили его с помощью Backspace.

\ r (он же ^ M ) был переведен на \ r \ n ( ^ M ^ J ) для эха и \ n ( ^ J ) для приложения.

Итак, каковы наши возможности для этих глупых приложений:

  • отключить echo ( stty -echo ). Это эффективно меняет способ отражения управляющих символов, ... не отражая ничего. Не совсем решение.
  • отключить echoctl . Это изменяет способ отображения управляющих символов (кроме ^ H , ^ M ... и всех остальных, используемых редактором строки). Затем они повторяются как есть.То есть, например, символ ESC отправляется как байт \ e ( ^ [ / 0x1b ) (который распознается как начало escape-последовательности. терминалом), ^ G вы отправляете \ a (BEL, из которого ваш терминал пищит) ... Не вариант.
  • отключить грубый редактор строк ( stty -icanon ). На самом деле это не вариант, поскольку сырые приложения станут намного менее удобными.
  • отредактируйте код ядра, чтобы изменить поведение дисциплины линии tty, чтобы echo управляющего символа отправляло \ e [7m ^ X \ e [m вместо просто ^ X (здесь \ e [7m обычно включает обратное видео в большинстве терминалов).

В качестве варианта можно использовать оболочку вроде rlwrap , которая представляет собой грязный прием для добавления модного строкового редактора в немые приложения. Фактически эта оболочка пытается заменить простые read () с терминального устройства на вызовы редактора строки readline (которые действительно меняют режим дисциплины линии tty).

Пойдя еще дальше, вы даже можете попробовать такие решения, как этот , который перехватывает весь ввод с терминала для прохождения через редактор строк zsh (который, как правило, выделяет ^ X в обратном порядке. video), опираясь на функцию GNU screen : exec .

Теперь для приложений, которые реализуют собственный строковый редактор, они сами решают, как выполняется echo . bash использует строку чтения для того, что не имеет никакой поддержки для настройки отображения управляющих символов.

Для zsh см.:

info --index-search='highlighting, special characters' zsh

zsh по умолчанию выделяет непечатаемые символы. Вы можете настроить выделение, например:

zle_highlight=(special:fg=white,bg=red)

Для выделения белого на красный для этих специальных символов.

Текстовое представление этих символов не настраивается.

В языковом стандарте UTF-8 0x18 будет отображаться как ^ X , \ u378 , \ U7fffffff (две неназначенные кодовые точки Unicode) как , , \ u200b (непечатаемый символ Юникода) как .

\ x80 в локали iso8859-1 будет отображаться как ^ � ... и т. Д.

1
24.07.2018, 17:40
1 ответ

Awkподход:

awk 'BEGIN{ head = "List for"; tail = "End for list for" }
     !a[$1]++ {
         if (NR > 1) print tail, name ORS;
         print head, $1;
         name = $1
     }
     END{ print tail, name }1' file

Выход:

List for Adam
Adam 111
Adam 222
Adam 333
End for list for Adam

List for Tom
Tom 111
Tom 222
Tom 333
End for list for Tom

List for Dick
Dick 111
Dick 222
Dick 333
End for list for Dick
3
27.01.2020, 23:23

Теги

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