Я хочу напечатать последнюю строку группы, используя sed - PullRequest
2 голосов
/ 14 октября 2019

У меня есть файл, который показан ниже

Section1
    George, 1998-1995
     Peter, 1999-1990
     Simon, 1988-1960
Section2
     Gery,  2019-2015
     John,  1984-1983
     Thomson,  1978-1965

Когда я даю Section1 Ожидаемый результат - Саймон, 1988-1960

Как и у меня, много разделов,Я хочу добиться этого с помощью sed без использования awk.

Я пробовал вот так. Но он имеет жесткое кодирование номера строки. А также это печать полного диапазона

sed -n '/Section1/,4{p}'

Здесь я мог бы удалить жесткое кодирование. Но не удалось напечатать последнюю строку. А также название следующего раздела также придет.

sed -n '/Section1/ , /Section./{p}'

Ответы [ 4 ]

2 голосов
/ 14 октября 2019

Это может сработать для вас (GNU sed):

sed '$b;N;/\nSection/P;D' file

Сделать движущееся окно из двух строк и напечатать первую строку, если вторая строка начинается Section и всегда последняя строка.

Для последней строки определенного раздела используйте:

sed -n '/^Section1/{:a;h;$!{n;/^\S/!ba};x;s/^\s*//p}' file
2 голосов
/ 14 октября 2019

A gnu awk раствор.

awk -v RS='Section' '$1=="1" {print $(NF-1),$NF}' file
Simon, 1988-1960

При установке селектора записи на Section, awk работает в блоке. Затем выведите второе и последнее поле соответствия блока 1, так как Section не содержит.

1 голос
/ 14 октября 2019

Вы можете рассмотреть возможность использования

sed -n '/^Section1$/,/^Section[0-9]*$/{:a;h;n;/^Section[0-9]*$/!ba;x;s/^[ \t]*//;p}' file > newfile

См. онлайн-демонстрацию .

Подробнее

  • -n - переключатель подавляет режим линейного вывода по умолчанию
  • /^Section1$/,/^Section[0-9]*$/ - блок строк между строкой, равной Section1, и строкой, которая полностью соответствует Section и любыми 0 или более цифрамиpattern (следующая группа команд {...} относится к диапазону, соответствующему этому)
  • :a - устанавливает метку с именем a
  • h - копирует текущую строку вудерживающий буфер
  • n - отбрасывает текущее значение пространства шаблона и считывает в него следующую строку
  • /^Section[0-9]*$/!ba - если значение пространства шаблона не совпадает со строкой конца блока, возвращайтесь кметка a
  • x - иначе, как только мы доберемся до последней строки, предыдущая находится в области удержания, поэтому x используется, чтобы поменять местами удержание и пространство шаблона
  • s/^[ \t]*// - удалить начальные пробелы
  • p - напечатать пробел.
0 голосов
/ 14 октября 2019

Regex:

(Section1)((\n.*,.*)*\n\s*)(?'lastLine'.*)

Тест здесь .

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

...