Символы \e[0;
в строке
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
интерпретируются оболочкой (приравнивая \e
к \033
ASCII ESC escape символу), начиная управляющую последовательность. Последовательность заканчивается на \a
(аналогично интерпретируется оболочкой \007` ASCII BEL bell).
0
- это параметр (для так называемой команды операционной системы), который говорит терминалу изменить и иконку, и заголовок окна.
Технически это должно быть \e\\\\
(ECMA-48), однако все началось не так. Когда эта функция была впервые представлена в 1986 году, xterm
завершал заголовок на первом непечатном символе.
\a
распознается xterm как терминатор строки с X11R4 в 1989 году (когда были добавлены отдельные параметры 1
и 2
для различения заголовков иконок и окон).
rxvt
подхватил это через пару лет, а еще через несколько лет xterm был модифицирован, чтобы также принимать стандартный терминатор строк. В журнале изменений об этом не было сказано ни слова, но впервые это появилось в ctlseqs.ms
в августе 1996 года. Обычно, когда другие терминалы реализовали эту возможность, они принимают \a
только.
Без окончания изолированный управляющий символ может быть расценен как ошибка в зависимости от терминала (включая полное игнорирование текста).
Дополнительная литература:
$ awk '{print $NF}' file | sort -u
Number_1
Number_3
Number_4
$ awk '{Arr[$NF]++}END{for(i in Arr)print i}' file
Number_3
Number_4
Number_1
(О, ладно, редактирование немного меняет вопрос.)
Самый простой способ напечатать только одну копию каждой строки вывода — передать через sort -u
(или sort | uniq
), хотя очевидно, что это приведет к сортировке вывода.
Другие связанные решения здесь: Печать уникальных строк
(Ответ на то, что я изначально думал, что вопрос:)
Чтобы напечатать только первую строку, которая соответствует регулярному выражению, мы можем использовать
grep -m1 ...
:
-m NUM, --max-count=NUM
Stop reading a file after NUM matching lines.
Если совпадения находятся на разных строках, это работает напрямую, но
если у вас есть несколько совпадающих строк в одной строке, то с -o
они все будут напечатаны, поэтому добавьте что-то вроде | голова -1
.
С GNU grep
:
$ echo Number_1 Number_2 | grep -Pom1 '^.*?\KNumber_\d+'
Number_1
Это совпадение с начала строки до первого вхождения Number_\d+
, но с \K
, отбросить то, что слева от него.