Até onde eu sei, tr
só funciona com caracteres únicos e "." é uma string e não um caractere, então é possível fazer o que você quer usando sed
ou awk
, por exemplo:
sed -e "s/\. /\n/g" file.txt > out.txt
Eu tenho um texto assim:
I am happy. I am here. How are you, Meg?
Eu quero que isso seja:
I am happy.
I am here.
How are you, Meg?
Para pontos finais, tentei
tr -s '. ' '\n' <file.txt >out.txt
Mas não está funcionando.
Você não faz. tr
não foi projetado para isso. Ele foi projetado para transliterar um conjunto de caracteres únicos para outro conjunto de caracteres únicos , por exemplo, A-Z
em a-z
. Usar tr
com .␣
(um ponto e um espaço) e \n
substituirão todos os pontos e espaços por novas linhas.
Use (GNU) sed
em vez disso:
$ echo 'I am happy. I am here. How are you, Meg?' | sed 's/\([!.?]\) /\n/g'
I am happy.
I am here.
How are you, Meg?
O script de edição sed
substituirá todas as ocorrências de !
, .
ou ?
que são seguidas por um espaço, pelo mesmo caractere e uma nova linha.
Como foi mencionado, você não pode alcançar o que deseja com tr
devido à natureza de tr
. Mas existem muitas outras alternativas. Por exemplo, o Python 2.
Como one-liner, poderíamos fazer isso:
python -c "import sys;print '\n'.join([ j.strip() for l in sys.stdin.readlines() for j in l.rstrip().split('.')])" < input.txt
Como um script, seria assim:
#!/usr/bin/env python
import sys
sentences = []
for line in sys.stdin:
for sentence in line.rstrip().split('.'):
sentences.append(sentence.strip())
print "\n".join(sentences)
E usado assim:
$ ./split_to_lines.py < input.txt
I am happy
I am here
How are you, Meg?
Nada particularmente complexo está acontecendo aqui - estamos simplesmente dividindo todas as linhas do arquivo em sentenças em .
e, em seguida, removendo o espaço à esquerda e à direita de cada sentença. Tudo o que entra em uma lista, que é então remontada via função .join()
.
Tags text-processing tr