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.