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