Removendo novas linhas de um arquivo RTF usando sed

2

Eu tenho um arquivo RTF que é formatado da seguinte forma:

    Lorem ipsum dolor sit amet, consectetur adipiscing elit.\par
Nullam vitae sem porttitor urna pellentesque gravida. Nulla\par
consequat purus vel est vehicula porttitor.\par
    Maecenas pharetra metus in enim sollicitudin sollicitudin.\par
Etiam et odio tellus, eget placerat enim. Aliquam sem purus,\par
gravida sed feugiat eget, consectetur quis nisl.\par

(\ par adicionado por brevidade)

Como você pode ver, novas linhas foram inseridas para ajustar a largura de uma página. O problema surge quando tento ler o texto no meu iPhone, que tem um comprimento de linha diferente. As linhas quebram e a legibilidade é prejudicada.

A solução ideal seria aquela que converte o arquivo em uma única linha para cada parágrafo, mantendo a nova linha e o recuo para novos parágrafos.

Até agora, tentei analisar o arquivo com sed , mas não consegui criar um regex de múltiplas linhas. Idealmente, quero substituir todos os "\ r \ n" por "", a menos que a próxima linha comece com um espaço.

Existe uma solução melhor para isso? Se não, como posso fazer isso usando sed?

    
por MoshiBin 28.07.2009 / 23:08

2 respostas

3

A solução mentiu em uma ferramenta Eu não tenho pensado seriamente - awk

awk 'BEGIN { FS="\\par" } ; /^    / {print "\par" $1} /^[^ ]/ {print " " $1}'

Isso irá passar pelo arquivo, com \ par como separador de campo, e imprimirá um \ par antes de qualquer linha que comece com 4 espaços (que marca o início de um novo parágrafo), e remova (ou simplesmente não imprima) quando começar com qualquer coisa além de um espaço.

Agora, o que temos é um arquivo com \ par somente quando as quebras de linha legais devem ser. O próximo passo seria remover todas as novas linhas, para se livrar de quebras de linha não autorizadas:

tr -d '\r\n'

Em seguida, alimente o resultado para sed para substituir \ par com \ par \ r \ n , praticamente adicionando uma nova linha em que \ par é.

sed 's/\par/\par\r\n/g'

E pronto.

O único problema real que encontrei com esse método é que ele arruinou o cabeçalho RTF. Não tem problema, acabei de copiar o cabeçalho do arquivo original.

Outra questão menor era que os títulos dos capítulos estavam sendo impressos em linha com os parágrafos anteriores. Isso ocorre porque os títulos dos capítulos não começam com um espaço, mas devem ser considerados como um parágrafo. No meu caso, os capítulos foram marcados assim:

CHAPTER THIRTY-TWO
Chapter's Name

Um sed rápido cuidou deles:

sed 's/\s*\(CHAPTER [[:upper:]-]* \)\(.*\par\)/\par\r\n\par\r\n\par\r\n\par\r\n\par\r\n/'

Agora tenho meu livro no formato adequado, o que o torna legível em outros dispositivos (como o meu iPod).

    
por 30.07.2009 / 23:48
2

Este regex corresponderá ao que você deseja:

\r\n(?! )


Então, para usar isso com sed:

sed 's/\r\n(?! )/ /g' filename.rtf


Exceto, parece que o sed não suporta lookahead negativo , e requer parens com barra invertida, então você pode usar:

sed 's/\r\n\([^ ]\)/ /g' filename.rtf
    
por 28.07.2009 / 23:20