Я не знаю, является ли sed
лучшим инструментом для этого. Я лично хожу в perl
за такими вещами и придумал вот это:
perl -pe 'BEGIN{ $/ = " more items"; } s/\.\.\.\s\d+ more items$//;'
-e
— текст программы для выполнения.
-p
означает выполнять неявный цикл над текстом программы один раз для каждой записи. (по умолчанию запись представляет собой строку, см. ниже для изменения этого ).
Это сначала устанавливает разделитель записей $/
от новой строки по умолчанию(\n
)до строки «больше элементов»; блок, обозначенный BEGIN { }
, выполняется один раз в начале.
Теперь он будет считывать входные данные по одному блоку за раз, вплоть до (и включая )разделитель записей. Таким образом, в каждом цикле у вас есть «что угодно... еще 1234 элемента» во входном буфере.
s/\.\.\.\s\d+ more items$//
— это замена, которая удаляет любую строку из трех точек (, экранированных для удаления специального значения «любого символа» ), за которым следует пробел (\s ), за которым следует одна или несколько цифр(\d+
)и текст «больше элементов» в конце записи($
). Сопоставление конца записи не обязательно, но может ускорить сопоставление.
Результат распечатывается по умолчанию благодаря опции -p
.
Мы знаем, что root
всегда 0
, но для других пользователей мы не знаем там uid.
В старые времена память и перфокарты -были дорогими, 0
на 3 символа меньше, чем root
. Поощрялось делать программы небольшими для экономии памяти, но за счет удобочитаемости.
Сейчас память стоит дешево. Лучше ориентироваться на читабельность. Людей до сих пор учат старым привычкам, потому что учителя не знают, почему мы так поступаем.