LINUX.ORG.RU

Разбить текст на абзацы

 


0

2

Здравствуйте.Мне нужно разбить произвольный текст на абзацы(по 4 предложения на абзац).Я нашёл что-то похожее, выполненное через sed: sed 's/\(\([^.]*.\)\{3\}[^.]*\)./\1\n/g' (Тут, конечно, не совсем то, что нужно, ибо в моём случае может быть не только точка но и другие знаки(?, !, ... и т.п)), но мне хотя бы с точкой разобраться не помешало бы.Так вот, в написанной выше команде текст разбивается на абзацы по 4 предложения, но при этом точка в конце каждого 4-го предложения исчезает, например:

Исходный текст: «sdasdasd, sad. sadasda d. sadadasd. asdad. psadad.»

Получившийся: «sdasdasd, sad. sadasda d. sadadasd. asdad (вот тут точка пропадает) psadad.» Т.е в команде выше 4-ая точка заменяется на новую строчку, написанную с нового абзаца.Подскажите, как переделать, чтобы точка оставалась(а не заменялась)?И, собственно, возможно ли как-то адекватно сделать, чтобы не только с точкой, но и с любым знаком конца предложения на абзацы разбивалось?

Спасибо.


Подскажите, как переделать, чтобы точка оставалась(а не заменялась)?

Заменять не на \n, а на \.\n.

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

А да, конечно, не увидел что точку не поставил, думал в синтаксисе какой-то косяк.

Inedel
() автор топика
$ echo "sdasdasd, sad. sadasda d. sadadasd. asdad. psadad. qwerty? asdffgh. zxcvbn! poiuy." | sed -r 's/(([^.!?]+[.!?]){4})(\s*)/\1\n/g'
sdasdasd, sad. sadasda d. sadadasd. asdad.
psadad. qwerty? asdffgh. zxcvbn!
poiuy.
$
anonymous
()
Ответ на: комментарий от anonymous

Спасибо большое, как раз то что нужно.

Inedel
() автор топика
14 декабря 2016 г.

Взяв за основу ваш код, чутка его изменил и получил нечто на подобии sed ‘s/(\([^.]*.\)\{4\}\)/\0\n\n/g’ соответсвенно если нужны и другие символы огончания предложения просто добавить их к точке.

PS не могу понять чем собственно отличется \0 от \1 в данном случае пробовал оба варианта и на ответ это не влияло (объясните чайнику)

anonymous
()
Ответ на: комментарий от anonymous

Что-то в документации такого нет, в исходника тоже не смог найти. Судя по поведению, \0 похож на &, то есть подставляет всё совпадение, а не только то, что находится внутри скобок:

$ echo sword | sed -r 's/s(.*)/\0/'
sword
$ echo sword | sed -r 's/s(.*)/\1/'
word

anonymous
()
Ответ на: комментарий от anonymous

Похоже на то, Спасибо за помощь

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.