Tenho o hábito de escrever uma linha por frase, porque normalmente compilo coisas para o LaTex ou estou escrevendo em outro formato no qual as quebras de linha são ignoradas. Eu uso uma linha em branco para indicar o início de um novo parágrafo.
Agora, eu tenho um arquivo escrito neste estilo que gostaria de enviar como texto sem formatação. Quero remover todas as quebras de linha únicas, mas deixar intactas as quebras de linha duplas. Isto é o que eu fiz:
sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt
Isso substitui as linhas vazias por algum texto que, confiante, não apareça no arquivo: NEWLINE
depois, ele se livra de todas as quebras de linha com awk (achei esse truque em algum site) e, em seguida, substitui NEWLINE
s com as duas quebras de linha necessárias .
Parece uma maneira muito complicada de fazer uma coisa bem simples. Existe uma maneira mais simples? Além disso, se houvesse uma maneira de substituir vários espaços (que às vezes se arrastam por algum motivo) por espaços únicos, isso também seria bom.
Eu uso o emacs, por isso, se houver algum truque específico do emacs que seja bom, mas prefiro ver uma versão pura sed ou awk pura.
fonte
tr -d "\n"
.Respostas:
Você pode usar o awk assim:
Ou se você precisar de uma nova linha extra no final:
Ou se você deseja separar os parágrafos por uma nova linha:
Esses comandos do awk usam ações que são protegidas por padrões:
ou
Uma ação a seguir será executada apenas se o padrão corresponder à linha atual.
E os
^$.
caracteres têm um significado especial nas expressões regulares, onde^
corresponde ao início da linha,$
ao final e a.
um caractere arbitrário.fonte
/./
fazendo: parece estar agindo como eelse
para a/^$/
correspondência de cordas, está certo?Use o modo de parágrafo do Awk ou do Perl para processar um arquivo, parágrafo por parágrafo, onde os parágrafos são separados por linhas em branco.
Obviamente, como isso não analisa o (La) TeX, ele mutilará terrivelmente comentários, ambientes detalhados e outras sintaxes especiais. Você pode procurar no DeTeX ou em outros conversores (La) TeX para texto.
fonte
Solução Sed
Observe que nesta solução
:a
está criando um rótulo e não usando oa
comandoSubstituindo Vários Espaços
Use
tr
:$ tr -s ' ' <test.text
fonte
Se entendi corretamente, uma linha vazia implica duas novas linhas consecutivas
\n\n
,.Nesse caso, uma solução possível seria eliminar todas as ocorrências singulares de novas linhas.
No Perl, uma asserção lookahead é uma maneira de conseguir isso:
-0777
sinalizador efetivamente comporta o arquivo inteiro em uma única sequência-p
diz ao perl para imprimir a string em que está trabalhando por padrão-i
especifica a edição no localfonte
(revivendo uma pergunta antiga)
Isso parece ser exatamente o que é
fmt
epar
serve para reformatar os parágrafos. Como você (e também como muitos programas), eles definem os limites dos parágrafos como uma (ou mais) linhas em branco. Tente canalizar seu texto através de um destes.fmt
é um utilitário unix padrão e pode ser encontrado no GNU Coreutils.par
é umfmt
texto muito aprimorado escrito por Adam M. Costello, que pode ser encontrado em http://www.nicemice.net/par/ (também foi empacotado para várias distribuições, incluindo o debian - eu o empacotei para o debian em janeiro de 1996, embora exista um novo mantenedor para o pkg agora.).fonte
sed
anexará qualquer linha aoH
espaço antigo que contenha pelo menos um único caractere. Ele imediatamente eliminad
todos aqueles, exceto talvez o último. As únicas linhas que podem permanecer são espaços em branco e é nessas linhas quandosed
ex
altera os espaços de espera e padrão e exclui todos os\n
caracteres de linha de ew acumulados .Se você deseja que as linhas que contêm apenas <tabs> ou <spaces> sejam consideradas em branco, substitua o
/./
endereço acima por/[^[:blank:]]/
. Para também espremer espaços, faça:fonte
Depois de ver os exemplos compactos perl e awk de Gilles, relutei em postar isso, mas já havia passado pelo exercício, e é um script funcional, razoavelmente documentado; este ponto por si só pode ser de interesse para alguns .. (sed com comentários! :)
Esse script considera as linhas em branco em branco, mesmo que contenham espaços em branco.
Vários espaços no texto são condensados em um único espaço.
O espaço em branco à direita é removido das linhas de texto. Linhas em branco consecutivas são recolhidas em uma única linha. O script deixa as linhas em branco superior e inferior intactas.
Para algo além dos scripts mais triviais, o sed pode ser escrito com muito mais facilidade em uma forma estruturada, como um arquivo de script separado. Aqui está um exemplo.
usando
chamada de sintaxe regex estendida : $ sed -rf script-file-text
Nota:
flush
nos comentários, significa: envie o espaço do padrão para o tratamento stdout interno do sed. Isso não significa uma impressão definitiva para o stdout. A saída depende da-n
opção do sed . por exemplo. oq
comando significa liberar e sair ... Compare esses dois trechos:echo x |sed -e q
imprime x,echo x |sed -ne q
imprime nada, enquanto o uso dop
comando imprime 'x' duas ou uma vez, dependendo da-n
opção.fonte
Aqui está outra
sed
solução que concatena todas as linhas nosed
"espaço de espera" de modo a obter uma sequência longa que finalmente é copiada para o "espaço padrão" para a correspondência de padrões.Como as novas linhas serão preservadas na sequência longa final no
sed
"espaço padrão", as linhas vazias em termos de quebras de linha duplas[^\n]\n\n[^\n]
podem ser correspondidas e modificadas para[^\n]\n[^\n]
.Para obter mais informações, consulte, por exemplo, sed e pesquisa e substituição de várias linhas .
fonte
Pode ser a velha escola:
Isso produzirá o texto alinhado à esquerda (
.ad l
), com o comprimento da linha de 80 (.ll 80
). A opção de comprimento da página (.pl
) informa ao processador de texto que faça preenchimento de página com o comprimento de página 1, portanto, sem preenchimento de página.Se você quiser todos os parágrafos em uma única linha, poderá usar um número grande para
.ll
:man 7 groff para mais opções de formatação.
fonte
No Emacs, às vezes uso isso
regex
:Significa:
fonte
Acontece que, com
auto-fill-mode
on, o emacs faz um bom trabalho nos meus casos de uso simples com apenasM-q
...fonte
auto-fill-mode
depende de qual modo principal você está ativo.