Скрипт Perl или Gawk, который возвращает ключевое слово, слово до и слово после?

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

Например: "Как я могу извлечь ключевые слова в контексте?" Я хочу: "извлечь ключевые слова в"

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

Есть у кого умные мысли?


person Rich Mason    schedule 06.10.2011    source источник
comment
что он должен вернуть, если перед нет слова (ключевые слова в начале файла)? То же самое, если в конце файла...   -  person tadmc    schedule 06.10.2011
comment
Что означает слово, когда вы его произносите? Каким должно быть слово перед предложением, ключевые слова должны быть найдены? Должно ли это быть , или предложение или предложение,?   -  person tadmc    schedule 06.10.2011
comment
Что ж, слово означает именно это в данном контексте, хотя возможность ‹tag›маркировки‹/tag› существует, поскольку это XML. Таким образом, я бы хотел, чтобы любая комбинация символов без пробелов существовала до и после пробелов вокруг ключевого слова. Если ничего не предшествует ключевому слову или не следует за ним, то ничего не нужно возвращать (или нуль, что угодно).   -  person Rich Mason    schedule 06.10.2011
comment
Чтобы ответить на ваш вопрос, tadmc, предложение, ключевые слова и следует. Надо бы вернуть. Итак, ключевое слово, пробел и блок символов перед следующим пробелом.   -  person Rich Mason    schedule 06.10.2011
comment
Итак, поскольку слово \S+, то keywords=none не содержит совпадений для ключевых слов? предложение, это не слово, поэтому оно НЕ означает именно это...   -  person tadmc    schedule 09.10.2011


Ответы (2)


Вот один из способов:

#!/usr/bin/perl

use 5.12.0;
my $keyword = 'keywords';

while (<DATA>)
{
    say for /\b(\S+\s+\b\Q$keyword\E[[:punct:]]*\s+\S+)\b/g;
}

__END__
How can I extract keywords in context, even if there are many keywords to
extract? So many keywords, no idea how to deal with them.
person Tanktalus    schedule 06.10.2011

grep -o достаточно:

grep -Po '(\S+\s)?keywords(\s\S+)?' << END
How can I extract keywords in context
How can I extract keywords
keywords in context
END

возвращается

extract keywords in
extract keywords
keywords in
person glenn jackman    schedule 06.10.2011
comment
Не изначально, а GnuWin или cygwin. - person glenn jackman; 06.10.2011
comment
Забавно о регулярных выражениях... они соответствуют только тому, что вы им говорите. (См. мой пример текста ниже - ваше регулярное выражение пропустит тот, у которого есть запятая - не уверен, что это желательно или нет.) - person Tanktalus; 06.10.2011
comment
@Tanktalus - Эй, ты тоже только что заработал (на чем я, вероятно, остановлюсь). Мне пришлось включить функцию say и перенаправить вывод в текстовый файл (более 15 000 результатов...), но это помогло. Спасибо вам обоим! - person Rich Mason; 07.10.2011