Как извлечь предложение из текстового файла в bash?

У меня есть книга в текстовом формате. который я конвертировал из pdf с помощью pdftotext. и я хочу извлечь случайное предложение из файла. имейте в виду, что предложение может иметь символ возврата в конце строки. поэтому я хочу найти способ получить напоминание о предложении в следующей строке. Так что я думаю, проблема будет заключаться в том, чтобы получить начало предложения. Обычно с большой буквы. "^[A-Z]", а затем перейти к следующему символу '.' Я пробовал такие вещи, как

grep "^[A-Z].*.$" text.txt

но это не работает. Также пробовал использовать IFS и назначать '.' как разделитель. но я получаю полный файл, распечатанный на экране. будет полезно, если я смогу напечатать полное предложение по одному в строке.

IFS=.
while read sentence; 
do 
    echo $sentence
done < the-prince.txt

person miatech    schedule 19.02.2019    source источник
comment
Попробуйте grep -Poz "^[A-Z][^.]*" text.txt, если у вас есть GNU grep   -  person Wiktor Stribiżew    schedule 19.02.2019
comment
@WiktorStribiżew вы забыли точку в регулярном выражении в конце предложения \..   -  person Raffi    schedule 19.02.2019
comment
@Raffi Возможно, . перед $ не экранировано, но если OP имел в виду буквальное ., да, точку можно использовать с \..   -  person Wiktor Stribiżew    schedule 19.02.2019
comment
@ Раффи, ребята, вы правы. означает символ в регулярном выражении ... но все же это оставляет меня с фактом, что мне нужно случайное предложение из файла. Это даст мне первое предложение   -  person miatech    schedule 19.02.2019
comment
@WiktorStribiżew Мне все еще нужно случайное предложение из файла..   -  person miatech    schedule 19.02.2019
comment
Не забывайте, что заглавная буква и точка могут стоять и в середине предложения, например: I have a friend named Mr. Smith   -  person anubhava    schedule 19.02.2019
comment
@anubhava хорошая мысль .. любые предложения   -  person miatech    schedule 19.02.2019


Ответы (1)


Во-первых, очень грубый пример на perl.

#!/bin/perl
$/='. ';
while (<>) { push(@_, $_) if /^[A-Z]/; }
print $_[rand @_], "\n";

Он не учитывает вопросы, восклицания, цитаты или проблему Mr. Something, а также не будет разумно форматировать предложения со встроенными переводами строк.

Есть и другие проблемы, но это должно по крайней мере помочь вам начать работу с Perl.

Для чистого bash, если это то, что вам нужно, мне придется поискать еще немного.

person Paul Hodges    schedule 19.02.2019