Não posso ter certeza sem ver um exemplo real de seus dados, mas o que você provavelmente está procurando é adicionar uma nova linha após cada ocorrência de . , ! e ? . Eu não sei como você quer lidar com ponto e vírgula ( ; ) já que eles não estão realmente marcando o fim de uma frase. Isso é contigo.
De qualquer forma, você pode tentar 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?
O s/// é o operador de substituição. Seu formato geral é s/pat/replacement e substituirá pat por replacement . O g no final faz com que seja executada a substituição em todas as ocorrências de pat . Sem isso, pararia no primeiro. O & é uma construção sed especial que significa "o que foi correspondido". Então, aqui estamos substituindo qualquer . , ! ou ? pelo que foi correspondido e uma nova linha.
Se o seu texto puder incluir abreviações como e.g. , talvez você queira substituir somente se a próxima letra for um CAPITAL:
$ echo 'This is a sentence! And so is this. And this one? Negative, i.e. no.' | sed 's/\([.!?]\) \([[:upper:]]\)/\n/g'
This is a sentence!
And so is this.
And this one?
Negative, i.e. no.
Observe que isso não lidará com sentenças como Dr. Jones said hello. corretamente, pois assumirá que . após Dr define uma sentença, já que a próxima letra é colocada em maiúscula. No entanto, estamos agora nos aproximando de um nível de complexidade muito além do formato Q & A simples e, na verdade, requer um analisador de linguagem natural completo.