Как распечатать только уникальные совпадения из регулярного выражения?

Символы \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 только.

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

Дополнительная литература:

2
05.04.2017, 01:43
4 ответа
grep -oE "Number_\w+"  | sort -u
5
27.01.2020, 21:52
$ 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
0
27.01.2020, 21:52

(О, ладно, редактирование немного меняет вопрос.)

Самый простой способ напечатать только одну копию каждой строки вывода — передать через sort -u (или sort | uniq), хотя очевидно, что это приведет к сортировке вывода.

Другие связанные решения здесь: Печать уникальных строк


(Ответ на то, что я изначально думал, что вопрос:)

Чтобы напечатать только первую строку, которая соответствует регулярному выражению, мы можем использовать grep -m1 ... :

-m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines. 

Если совпадения находятся на разных строках, это работает напрямую, но если у вас есть несколько совпадающих строк в одной строке, то с -o они все будут напечатаны, поэтому добавьте что-то вроде | голова -1.

2
27.01.2020, 21:52

С GNU grep:

$ echo Number_1 Number_2 | grep -Pom1 '^.*?\KNumber_\d+'
Number_1

Это совпадение с начала строки до первого вхождения Number_\d+, но с \K, отбросить то, что слева от него.

0
27.01.2020, 21:52

Теги

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