Как поместить предложения на отдельные строки на Linux

Если Вы не находитесь на очень старых/низких аппаратных средствах спецификации, работая gnome/gtk приложения в KDE (или kde/qt приложения в GNOME) не должен оказывать значимое влияние на производительность.
Когда Вы идете KDE, qt/kde освобождает уже загружаются в памяти, gtk/gnome освобождает не. Это только при увольнении a gtk/gnome приложение это gtk/gnome освобождает загружаются, при этом побочный эффект является более высоким использованием памяти (дополнительный, освобождает, загружаются в память), и возможно (на медленном HDD) более длительное начальное время запуска gtk приложение.

7
18.03.2015, 19:26
7 ответов

Есть жизнь за пределами одноклассников ...

Съемники предложения никогда не готов, всегда есть еще одна деталь, чтобы исправить: Perl Multiliner!

#!/usr/bin/perl

use strict;
my $pont=qr{[.!?]+};                   ## pontuation
my $abrev=qr{\b(?:Pr|Dr|Mr|[A-Z])\.};  ## abreviations

$/="";   

while(<>){ chomp;                      ## for each paragraph,

  s/\h*\n\h*/ /g;                      ## remove \n
  s/($pont)\h+(\S)/$1\n$2/g;           ## pontuation+space
  s/($abrev)\n/$1 /g;                  ## undo \n after abreviations

  print "$_\n\n";
}

Итак с:

A single ‘-’ operand is not really an option ! It stands for
standard input. Or for standard output ? For example:
‘smth -’ reads from stdin; and is equal
to plain ‘smth’... Could it appear as any operand that
requires a file name ? Certainly !

Robert L. Stevenson wrote  Dr. Jekyll and Mr. Hyde. Back in 12.12.1886

the end

Выход:

A single ‘-’ operand is not really an option !
It stands for standard input.
Or for standard output ?
For example: ‘smth -’ reads from stdin; and is equal to plain ‘smth’...
Could it appear as any operand that requires a file name ?
Certainly !

Robert L. Stevenson wrote  Dr. Jekyll and Mr. Hyde.
Back in 12.12.1886

the end
1
27.01.2020, 20:13

Вместомодайте SED

sed 's/\./\.\n/' file.txt
2
27.01.2020, 20:13

Попробуйте:

awk -F. '{ for (i=1;i<=NF;i++) printf "%s.\n",$i ;} ' < input_file > output_file

где

  • awk использует . (точка) в качестве сепаратора,
  • и петли для каждого поля, печатание линии, точечная новая линия
1
27.01.2020, 20:13

Попробуйте:

sed -e :1 -e 's/\([.?!]\)[[:blank:]]\{1,\}\([^[:blank:]]\)/\1\
\2/;t1'

на входе типа:

Sentence 1. Sentence 1.2? Sentence 2!? Sentence 3.
Sentence 4... Sentence 5.

дает:

Sentence 1.
Sentence 1.2?
Sentence 2!?
Sentence 3.
Sentence 4...
Sentence 5.

(и является POSIX).

6
27.01.2020, 20:13

В задаче есть некоторые подводные камни. Одним из вариантов может быть:

sed 's/\([.?!;]\) */\1\n/g' file.txt

Это подстановка символов в заданном наборе ([...?! ;], добавить двоеточие или удалить точку с запятой, как вам удобно), после чего дополнительные пробелы ( *) на заменяемый символ (\1 расширяются до совпадения между \( и \)) и новой строкой (\n).

2
27.01.2020, 20:13

Я не могу быть уверен, не увидев фактический пример ваших данных, но то, что вы , вероятно, ищут добавление новой строки после каждого вхождения . , ! и ? . Я не знаю, как вы хотите разобраться с запятой (; ; ; ; ), поскольку они не совсем отмечают конец предложения. Это зависит от вас.

В любом случае, вы можете попробовать SED :

$ echo 'This is a sentence! And so is this. And this one?' | 
    sed 's/[.!?]  */&\n/g' 
This is a sentence! 
And so is this. 
And this one?

/// - это оператор замещения. Его общий формат составляет S / PAT / замена , и он заменит PAT с заменой . G в конце запускают его замену на все вхождения PAT . Без этого он остановится на первом. & - это специальное SED , что означает «все, что было сопоставлено». Итак, здесь мы подставляем любой из . , ! или ? с тем, что было сопоставлено и новая линия.

Если ваш текст может включать в себя аббревиатуры, такие как E.g. Возможно, вы захотите заменить только если следующее письмо является капиталом:

$ echo 'This is a sentence! And so is this. And this one? Negative, i.e. no.' | sed 's/\([.!?]\) \([[:upper:]]\)/\1\n\2/g' 
This is a sentence!
And so is this.
And this one?
Negative, i.e. no.

Обратите внимание, что это не будет иметь дело с предложениями, такими как DR. Джонс сказал привет. правильно, поскольку оно предположит, что . После DR определяет предложение, учитывая, что следующее письмо является капитализированным. Тем не менее, мы сейчас приближаемся к уровню сложности, который выходит за пределы простого формата Q & A и фактически требует полноценного парсера натурального языка.

16
27.01.2020, 20:13
sed 's/\([.!?]  *\)\{0,1\}/\1\\/g' <infile | xargs printf %s\\n

У меня раньше была эта штука с fold - и это было быстро - но я понял, что могу сделать то же самое с xargs без предварительной обработки ввода или реализации любого sed переходил в цикл, если я просто экранировал с обратной косой чертой все, что не было завершающим символом или любыми последующими пробелами.

Таким образом, в приведенном выше операторе sed будет соответствовать либо нулевой строке, либо завершающей последовательности для каждого символа (не в последовательности) , который встречается во входных данных. В правой части sed заменяет либо нулевую строку, либо завершающую последовательность на \ 1 , а затем вставляет обратную косую черту. В результате каждый символ, кроме одного из .!? , за которым следует хотя бы один пробел, получает экранирование обратной косой черты \ . Этот включает строку \ n , которую sed вставляет после каждой замены при записи в стандартный вывод.

Поскольку xargs полностью исключит экранированную обратную косую черту \ n ewline и разделит аргументы, которые он передает своей названной утилите на неэкранированные пробелы, printf завершается печать всех строк, подобных предложению, которые xargs считывает во входных данных без каких-либо конечных пробелов и в одной строке на каждый. Более того - он делает это партиями, приближающимися к размеру ARGMAX - как можно больше за раз. И, конечно же, sed также должен выполнять свою работу довольно быстро - ему достаточно сделать только одну глобальную замену для каждой строки ввода.

Результаты выглядят так:

Некоторые Lorem Ipsum взяты с www.lipsum.com :

sed 's/\([.!?]  *\)\{0,1\}/\1\\/g' <<LIPSUM | xargs printf %s\\n
Section 1.10.32 of "de Finibus Bonorum et Mal
orum", written by Cicero in 45 BC
"Sed ut perspiciatis unde omnis iste natus er
ror sit voluptatem accusantium doloremque lau
dantium, totam rem aperiam, eaque ipsa quae a
b illo inventore veritatis et quasi architect
o beatae vitae dicta sunt explicabo.
Nemo enim ipsam voluptatem quia voluptas sit 
aspernatur aut odit aut fugit, sed quia conse
quuntur magni dolores eos qui ratione volupta
tem sequi nesciunt.
Neque porro quisquam est, qui dolorem ipsum q
uia dolor sit amet, consectetur, adipisci vel
it, sed quia non numquam eius modi tempora in
cidunt ut labore et dolore magnam aliquam qua
erat voluptatem.
Ut enim ad minima veniam, quis     ...
...
reiciendis voluptatibus maiores alias consequ
atur aut perferendis doloribus asperiores rep
ellat."        1914 translation by H.

LIPSUM

... что печатает ...

Section 1.10.32 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC
"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
Ut enim ad minima veniam, quis     ...
...
reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."        1914 translation by H.
-1
27.01.2020, 20:13

Теги

Похожие вопросы