Como eu uso o comando tr para substituir: pontos completos, exclamações e pontos de interrogação seguidos por um espaço, com novas linhas?

6

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.

    
por user110327 03.01.2017 / 13:03

3 respostas

7

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
    
por 03.01.2017 / 13:09
14

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.

    
por 03.01.2017 / 13:12
0

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() .

    
por 04.01.2017 / 01:54