2016-10-04 3 views
0

Существует некоторый текст, который мне нужен с веб-страницы, страница, длина которой несколько меняется со дня на день. Я ищу, чтобы загрузить этот текст периодически. Я не хочу/нуждаюсь в нескольких десятках строк как с начала, так и с конца примерно на 250 строк. Общее количество строк на странице будет непредсказуемым, поэтому мне нужно будет установить начальные/конечные точки для удаления, которое я хочу выполнить, на основе битов текста, которые не меняются изо дня в день. Я определил целевые текстовые шаблоны, поэтому я ищу для анализа содержимого на основе тех, что нежелательные строки удаляются в результирующем документе. Я хочу использовать утилиты командной строки для этого, так как я хотел бы автоматизировать процесс и сделать из него работу cron.Решение командной строки для удаления строк до/после соответствия шаблону

Метод загрузки выбора заключается в использовании lynx -dump www.specified.url my-download.txt

Эта часть работает отлично. Но обработка дампа, чтобы отрезать ненужные начальные и конечные строки, пока не работает. Я нашел патч в пример, который, по-видимому, должен делать то, что мне нужно:

sed -n '/Phrase toward the beginning/,/Phrase toward the end/p' file_to_parse.txt >parsed_file.txt

Он работает частично, то есть он отрезает начало файла по адресу правой точки (все строки, предшествующие «Фраза к началу»). Но я не могу заставить его вырезать линии с конца, т. Е. Строки, следующие за фразой «Фраза к концу». Все мои попытки с использованием этой формулы до сих пор не касались конца файла. Вероятно, я должен упомянуть, что большинство строк в выгруженном файле lynx производит по какой-либо причине три пробела - включая строку «Фраза в конец», которую я пытаюсь указать в качестве точки, после которой дальнейшие строки должны быть удалена.

Я предполагаю, что может быть более одной утилиты, которая может выполнять вид разбора, который я после - sed и awk - вероятные кандидаты, о которых я могу думать. Я склоняюсь к sed, потому что его работы для меня немного менее таинственны, чем awk. Но, честно говоря, у меня действительно есть только самые неопределенные представления о том, как использовать sed. Когда дело доходит до использования и/или понимания awk, я теряюсь очень, очень быстро. Возможно, есть и другие утилиты, которые могут на основе текстовых шаблонов отрывать части начала и окончания текстового файла?

Будет оценен вход, как я могу использовать sed, awk или любую другую аналогичную утилиту - для достижения моей цели. Это должно быть сделано на машине Ubuntu, кстати.

LATER EDIT: извините за отсутствие публикации и примера. Загруженный страница будет выглядеть как следующий

Нежелательные линии 1
Нежелательные линия 2
Нежелательные линия 3
Нежелательные линии и т.д.
фраза к началу
Wanted линия 1
Wanted линия 2
Требуется линия 3
Требуется линия ca 4-198
Фраза по направлению к концу
Нежелательная линия 200
Нежелательная линия 201
Нежелательная линия 202
Нежелательная линия. , ,(Конец файла)

Окончательный результат должен выглядеть, с другой стороны, как

фразы по отношению к началу
Wanted линия 1
Wanted линия 2
Wanted линия 3
Wanted линии ч 4-198
фразы к концу

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

+0

, пожалуйста, разместите небольшой тестовый ввод с ожидаемым результатом. История форма хороша, но данные лучше. – karakfa

+2

вместо написания эссе, это поможет, если вы просто приведете примеры, см. Http://stackoverflow.com/help/mcve – Sundeep

+0

Ваша команда работает для меня с вашим примером ввода. Ваш реальный вход должен содержать что-то, что не отражено в примере. Может быть, конечная фраза, охватывающая несколько строк? –

ответ

1

Если sed кажется слишком сложным для отладки, рассмотрите двойной grep; например, здесь мы приводим цифры от 1 до 250, затем grep для , плюс до 1000 строк после того, тогда grep для , плюс до 1000 строк до этого:

seq 250 | grep -A 1000 '^70$' | grep -B 1000 '^80$' 

Выход:

70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 

Поскольку максимальная длина входных файлов, как известно, является безопасным числом для данных (но избыточна для приведенного выше примера).

Применительно к данным ОП, пример стал бы:

grep -A 1000 'Phrase toward the beginning' download_page.txt | \ 
grep -B 1000 'Phrase toward the end' 

Доводка преимущество над sed является то, что сообщения об ошибках grep проще, чем из sed.

+0

Спасибо. Это может сработать для меня. Это было не поначалу, но, как вы заявляете, я получал сообщение об ошибке, за которым я мог следить, - это бинарный файл. Просмотрев страницу grep man, я нашел ключ -a, который будет «обрабатывать двоичный файл, как если бы это был текст». Как только я добавил, что переключиться на команду, он работает как рекламируемый. – MJiller

Смежные вопросы