Удалить весь текст после месяца, года

Я пытаюсь создать список кратких описаний RFC, анализируя индекс ietf RFC. Я надеюсь на какую-то команду для эффекта curl https://www.ietf.org/download/rfc-index.txt | sed 'magic' | awk 'more magic' | cut -f ?

Не проанализированный вывод команды curl https://www.ietf.org/download/rfc-index.txt выглядит так:

6708 Application-Layer Traffic Optimization (ALTO) Requirements. S.
      Kiesel, Ed., S. Previdi, M. Stiemerling, R. Woundy, Y. Yang.
      September 2012. (Format: TXT, HTML) (Status: INFORMATIONAL) (DOI:
      10.17487/RFC6708) 

6709 Design Considerations for Protocol Extensions. B. Carpenter, B.
     Aboba, Ed., S. Cheshire. September 2012. (Format: TXT, HTML)
     (Status: INFORMATIONAL) (DOI: 10.17487/RFC6709) 

6710 Simple Mail Transfer Protocol Extension for Message Transfer
     Priorities. A. Melnikov, K. Carlberg. August 2012. (Format: TXT,
     HTML) (Status: PROPOSED STANDARD) (DOI: 10.17487/RFC6710) 

6711 An IANA Registry for Level of Assurance (LoA) Profiles. L.
     Johansson. August 2012. (Format: TXT, HTML) (Status: INFORMATIONAL)
     (DOI: 10.17487/RFC6711) 

Я надеюсь получить вывод, который отсекает лишние примечания в Месяц Год:

6708 Application-Layer Traffic Optimization (ALTO) Requirements. S.
      Kiesel, Ed., S. Previdi, M. Stiemerling, R. Woundy, Y. Yang.

6709 Design Considerations for Protocol Extensions. B. Carpenter, B.
     Aboba, Ed., S. Cheshire.

6710 Simple Mail Transfer Protocol Extension for Message Transfer
     Priorities. A. Melnikov, K. Carlberg. 

6711 An IANA Registry for Level of Assurance (LoA) Profiles. L.
     Johansson.

person Lenna    schedule 19.04.2020    source источник
comment
Добро пожаловать в Stack Overflow. SO — это страница вопросов и ответов для профессиональных и увлеченных программистов. Добавьте свой собственный код к вашему вопросу. Ожидается, что вы продемонстрируете, по крайней мере, объем исследований, которые вы вложили в решение этого вопроса самостоятельно.   -  person Cyrus    schedule 19.04.2020
comment
Я рекомендую вам использовать структурированные данные вместо текста. Существует XML-файл, содержащий все метаданные RFC, и вы могли бы использовать что-то например XMLStarlet, чтобы извлечь нужные данные.   -  person Benjamin W.    schedule 20.04.2020


Ответы (2)


Это использует команду sed:

sed -r 's/^(.*)(January|February|March|April|May|June|July|August|September|October|November|December) [[:digit:]]{4}(.*)$/\1/'

Просто подключите к нему curl.

Некоторые детали:

  • -r: используйте "Расширенные регулярные выражения"
  • Захват выходных данных до «$month $year» в первой группе (обозначается скобками)
  • Захватите "$month $year" во второй группе.
  • Захватите остальных в третьей группе.
  • Вывести только первую группу (\1)

Вот часть об sed из классической серии статей об инструментах командной строки Брюса Барнетта.

person dav23r    schedule 19.04.2020
comment
Это изменит только строки, содержащие дату, но не строку после нее. - person Benjamin W.; 20.04.2020
comment
Это был sed трюк, который я искал. Возможность переключать несколько слов (с регулярным выражением). Этот пример кода не дает точного вывода, который я искал, но в сочетании с большим количеством sed будет. - person Lenna; 20.04.2020

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

Следующая команда работает с вашим вводом:

sed -zE 's/[^.]+\.[ \n]+\([^)]+\)[ \n]+\([^)]+\)[ \n]+\([^)]+\)//g' yourfile

По сути, он соответствует последним (и единственным) трем текстам в скобках (\([^)]+\)) вместе с последней завершающейся точкой строкой ([^.]+\.), которая им предшествует. Это позволяет разделять эти три составляющие пробелами и/или символами новой строки ([ \n]+).

Кроме того, с опцией -z sed обрабатывает входной файл как одну строку. -E означает использование + вместо \+ для обозначения 1 или более (ценой необходимости писать \( и \) для соответствия буквальным скобкам).

person Enlico    schedule 19.04.2020