Как исправить строки, оборванные в неправильных местах?

Вы также можете использовать менеджеры плагинов, такие как:

11
31.07.2017, 13:32
7 ответов

попробуй

awk '$NF !~ /\.$/ { printf "%s ",$0 ; next ; } {print;}' file

где

  • $NF !~ /\.$/строка совпадения, где последний элемент не заканчивается точкой,
  • { printf "%s ",$0напечатать эту строку с пробелом в конце и без перевода строки,
  • next ; }выбрать следующую строку,
  • {print;}и распечатайте его.

Я уверен, что будет вариант sed.

Обратите внимание, :это будет работать со строкой, заканчивающейся точкой, однако условие в предложениях, начинающихся с заглавной буквы, не будет объединено. Смотрите ответ Стефана Шазеласа.

7
27.01.2020, 19:57

В перле:

#!/usr/bin/perl -w
use strict;
my $input = join("", <>);
$input =~ s/\n([a-z])/ $1/g;
print $input;

Технически вы хотели заменить «новую строку, за которой следует буква нижнего регистра -» на «пробел и -эту букву -нижнего -регистра -», что и является ядром приведенного выше perl. скрипт делает:

  1. Чтение ввода в строку input.
  2. Обновите переменную input, чтобы она стала результатом операции поиска и замены.
  3. Распечатать новое значение.
4
27.01.2020, 19:57

С помощью sedвы можете использовать N;P;Dцикл (, чтобы всегда иметь две строки в пространстве шаблона, и если первый символ после новой строки в нижнем регистре, то заменить новую строку пробелом )и a tесть -таким образом после каждой sзамены вы перезапускаете цикл:

sed -e :t -e '$!N;/\n[[:lower:]]/s/\n/ /;tt' -e 'P;D' infile
4
27.01.2020, 19:57

Другой способ сделать это:

perl -lpe '$\ = /\.$/ ? $/ : $"' data

где:$\=> ORS, $/=> IRS= \n, $"=space

perl -pe '$_.= <>, eof or redo if s/[^.]\K\n/ /' data

sed -e '
   :a
      /\.$/!N
      s/\n/ /
   ta
' data
3
27.01.2020, 19:57

Сawk:

awk -v ORS= '{print (NR == 1 ? "" : /^[[:lower:]]/ ? " " : RS) $0}
             END {if (NR) print RS}'

То есть не добавлять разделитель записей к каждой строке (ORS пусто ). Но добавьте разделитель записей перед текущей строкой, если он не находится в первой строке и текущая строка не начинается с буквы нижнего регистра. В противном случае вместо этого добавьте пробел, за исключением первой строки.

10
27.01.2020, 19:57

Питон 3

import re
print(re.sub(r'\n([a-z])', r' \1', open('file.txt').read(), flags=re.MULTILINE))

Это то же регулярное выражение/подстановка, что и ответ Джеффа

2
27.01.2020, 19:57

Использование sedиfmt:

$ sed -e '1n; s/^[[:upper:]]/\n&/' input.txt | fmt
This is one sentence that is broken.

However this is a good one.

And this one is somehow, broken into many.

Сценарий sed вставляет новую строку перед каждой строкой, начинающейся с заглавной буквы (, за исключением самой первой строки ввода ). Вывод sedзатем передается в fmtдля переформатирования результирующих абзацев.

В качестве альтернативы используйте par, если он у вас установлен. Это еще одно преобразование абзаца, но гораздо более функциональное, чем fmt, с большим количеством функций и опций.

Обратите внимание, что между каждым абзацем будет пустая строка. Абзацы должны отделяться друг от друга хотя бы одной пустой строкой. Без пустых строк весь ваш входной образец переформатируется как один абзац из нескольких -предложений, например.:

$ fmt input.txt
This is one sentence that is broken.  However this is a good one.
And this one is somehow, broken into many.

Если вам нужно удалить пустые строки после переформатирования, просто передайте их через sedснова -, но это удалит ВСЕ пустые строки, включая те, которые могли быть в исходном вводе. например.

$ sed -e '1n; s/^[[:upper:]]/\n&/' input.txt | fmt | sed -e '/^$/d'
This is one sentence that is broken.
However this is a good one.
And this one is somehow, broken into many.
3
27.01.2020, 19:57

Теги

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