Список дней рождения в том порядке, в котором они будут с сегодняшнего дня

less -U делает текст неразборчивым. Альтернативой может быть предварительная обработка текста для использования комбинирующих символов Юникода для выделения жирного шрифта и подчеркивания. Например, использование U + 0332 для подчеркивания и жирного шрифта, представленного в виде двойного подчеркивания с U + 0333.

Вы можете создать сценарий upager , например:

#! /bin/bash -
ul=$'\u0332' bold=$'\u0333' bs=$'\b'
sed "s/\(.\)$bs\1/\1$bold/g;s/_$bs\(.\)/\1$ul/g" | less

Затем:

export MANPAGER=upager

man bash будет отображать как:

   r̳e̳a̳d̳  [-̳e̳r̳s̳]  [-̳a̳  a̲n̲a̲m̲e̲] [-̳d̳ d̲e̲l̲i̲m̲] [-̳i̳ t̲e̲x̲t̲] [-̳n̳ n̲c̲h̲a̲r̲s̲]
   [-̳N̳ n̲c̲h̲a̲r̲s̲] [-̳p̳ p̲r̲o̲m̲p̲t̲] [-̳t̳ t̲i̲m̲e̲o̲u̲t̲] [-̳u̳ f̲d̲] [n̲a̲m̲e̲ ...]
          One line is read from the standard input,  or  from
          the  file  descriptor f̲d̲ supplied as an argument to

И вы можете выполнить поиск по тексту, выделенному жирным или подчеркнутым на / читать , например.

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


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

Невидимые символы, такие как U + 200B, пространство нулевой ширины, отображаются как меньше как , поэтому не являются вариантом. Тем не менее, персонаж, который, похоже, работает, - это U + 034F Объединяющий объединяющий графем . Этот комбинированный символ невидим и обычно не влияет, по крайней мере, на английский текст.

Таким образом, вы можете создать пейджер gcjpager , например:

#! /bin/bash -
cgj=$'\u34f' bs=$'\b'
sed "s/.$bs./&$cgj/g" | less

export MANPAGER = / path / to / gcjpager ).

4
07.04.2017, 12:21
2 ответа

Сначала измените «/» в пробелах и выполните сортировку

sed 's|/| |' data | sort -k1,1n -k2,2n >out.tmp

Затем выведите следующие даты до и предыдущие после

awk -v m=4 -v d=7 '$1 > m || $1 == m && $2 >= d' out.tmp
awk -v m=4 -v d=7 '$1 < m || $1 == m && $2 <  d' out.tmp
2
27.01.2020, 20:48

Может быть, что-то вроде:

date +'%m/%d 0000' |
  sort -nt/ -k1 -k2 - birthdays.txt |
  awk '$2 == "0000" {past_today = 1; next}
       past_today {print; next}
       {next_year = next_year $0 RS}
       END {printf "%s", next_year}'

То есть вставить строка 04/07 0000 ( date +% - m /% - d выведет 4/7 с некоторыми реализациями date , но не переносится, и 04/07 работает так же) перед сортировкой по дате, а затем awk переместите строки, которые находятся перед этой, в конец.

sort ... - birthdays.txt

сортирует как свой стандартный ввод (представленный - , здесь канал, который вводится по дате ), так и содержимое Birthdays.txt .

Мы устанавливаем разделитель ключей на / с помощью -t / , -k1 указывает ключ сортировки, который выполняется от начала до конца строки (в по сути, -k1 указывает всю строку как ключ сортировки), а -k2 ключ сортировки, который начинается с первого символа после первого / до конец строки, но с -n они интерпретируются как числа, поэтому имеет значение только начальная последовательность цифр.

(приведенное выше будет работать с любой оболочкой типа Bourne (включая bash ), не нужно устанавливать только для этого bash ).

8
27.01.2020, 20:48

Теги

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