TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #467 10.7K
Здравствуйте товарищи. Ну чо, как оно?

Поехали еBash’ить. Сегодня разберем интересную задачку, которую я подкидываю на собесы. Задача со звездочкой.

Суть задачи: нужно вывести строки в окно терминала и пронумеровать их используя только один вызов sed. Аналогично выводу команды nl.

То есть должно получиться такое:

printf '%s\n' {a..d} | nl


1 a
2 b
3 c
4 d


Только это нужно сделать с помощью одного вызова sed.

Обычно кто берется ее решать, спустя какое-то время говорят — Роман, иди нахуй, это сделать невозможно!

Так говорят бедолаги, которым либо лень что-то делать, либо писька еще не отросла. Всё возможно, было бы желание.

Короче поехали решать. Давай попробуем сразу с sed несколько вариантов.

printf '%s\n' {a..d} | sed '='  
printf '%s\n' {a..d} | sed -n 'p;='
printf '%s\n' {a..d} | sed -n '=;p'


Ну чет да… ожидаемый результат совсем не ожидаемый.

Дело в том, что когда sed встречает команду «=», он тут же пишет текущий номер строки с завершающим символом «\n» или «\0». То есть номер и строка разделены «\n» или «\0».

Поэтому в примерах по sed для решения этой задачи, используют два вызова.

printf '%s\n' {a..d} | sed '=' | sed 'N;s/\n/ /'


Вот так всё корректно отработает, но задачу мы не решили, условия другие. Нам можно использовать лишь один sed.

✔ Чо будем делать? Думать ёпта!

Для начала надо посмотреть, а что мы имеем и на что можем повлиять.

Утилита sed пишет строки. Куда она их пишет? Вот и решение…

Вставляем в начало каждой строки, управляющую последовательность. Которая переместит курсор на предыдущую строку и установит его например в 3 колонку.

printf '%s\n' {a..d} | sed '=;s/^/\x1b[1A\x1b[3G/'


Получаем ожидаемый результат:

1 a
2 b
3 c
4 d


Поздравляю! Задача решена с помощью всего лишь одного вызова sed.

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


Изучай. Всех с пятницей и хороших предстоящих выходных. Береги себя!

tags: #bash #linux
—
🔔 @bashdays
More from @bashdays
  1. Sep 30, 2026↗️ Для всех, кто строит 15 октября Cloud․ru соберет инженеров, которые строят и эксплуатир…
  2. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  3. Sep 24, 2026Post #1565
  4. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  5. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  6. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →