Existe uma ferramenta de linha de comando para inserir quebras de linha em uma cadeia longa?

18

Dada uma string longa que precisa ser exibida com largura de texto limitada, existe uma ferramenta de linha de comando no * nix que converte a string de linha única em uma string de várias linhas, com cada linha não mais do que uma largura de texto especificada?

Por exemplo, dada a seguinte sequência

$ MYSTRING="Call me Ishmael. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world."

Eu gostaria de formatar algo assim:

$ echo $MYSTRING | special-format-command --width=30
Call me Ishmael. Some years ag
o - never mind how long precis
ely - having little or no mone
y in my purse, and nothing par
ticular to interest me on shor
e, I thought I would sail abou
t a little and see the watery 
part of the world.
Cory Klein
fonte

Respostas:

24

Você pode tentar o foldcomando:

echo "$MYSTRING" | fold -w 30
Christopher
fonte
2
+1, mas talvez seja melhor escrito como echo $MYSTRING | fold -w 30, já que a -30sintaxe não aparece na página de manual da dobra ?
ire_and_curses
5
Para a posteridade, há também fmt. A diferença entre folde fmté que foldserá quebrada na largura fixa, mesmo dividindo as palavras e pode começar as linhas com espaços em branco. Embora fmtseja agrupado próximo ou abaixo da largura, ele não dividirá palavras, as linhas não começarão com espaços em branco e as linhas curtas poderão ser unidas.
bahamat
5
foldparece ter um comportamento semelhante ao fmtquando a -sopção é usada.
Cory Klein
engraçado, eu usei -w opção, mas dividi-lo por char.
amphibient
6

Aqui está um método usando sed:

sed 's/.\{30\}/&\
/g'
Chris Down
fonte
Mas o que isso significa?
Richard
11
@ Richard Substitua 30 de qualquer caractere, exceto newline ( .\{30\}), pela mesma string ( &), seguida por uma nova linha.
Chris Baixo
6

Todo o objetivo de fmt(parte do GNU coreutils e outras versões do IIRC foram incluídas com nixes não-GNU *, portanto é quase certo que já esteja instalado) é reformatar parágrafos.

No entanto, existe uma ferramenta ainda melhor chamada par(para reformatação de parágrafos). Ele pode fazer tudo o que fmtpode, mas com muito mais opções para controlar o formato exato da saída.

Uma das muitas coisas realmente legais paré que é muito inteligente lidar com citações em e-mails (mesmo em vários níveis) - muito útil ... Eu tenho meu .vimrc configurado para que pressionar F5 envie o parágrafo atual pelo par.

Se não estiver empacotado para sua distribuição (é para debian e derivados, provavelmente outros também), o par pode ser encontrado em http://www.nicemice.net/par/

cas
fonte
Por "non-GNU * nixes", você quer dizer o "real" (não o "Unix-like") Unixes? (Caso contrário arrefecer ferramenta, que parece.)
Emanuel Berg
quero dizer, agora obsoleto, lixo * nixes proprietários.
cas 4/13
Foi o que pensei, mas por que você está usando o asterisco? Eu pensei que era para ter que digitar "tipo Unix" o tempo todo (para Linux etc.). (Não estou incomodando mais um detalhe - ou bem, eu sou - mas eu realmente quero saber, eu não estou incomodando por causa disso.)
Emanuel Berg
*nixé apenas uma maneira de dizer "sistemas genéricos unix ou similares a unix" - data de uma época em que a palavra Unix era uma marca registrada da AT&T
cas
3

fold -s é a melhor e mais curta resposta para sua pergunta.

No entanto, por mais boas que sejam essas ferramentas de uso único, em geral, você deve solicitar que seu editor faça isso.

No Emacs, você pode ajustar isso da maneira que quiser. Quanto a mim, eu uso visual-line-mode(aparece como um Wrapmodo menor na linha de modo) porque, no caso geral, não quero quebras de linha em nenhum outro lugar além do final dos parágrafos.

Pensei em dizer o que faço. Não é "o caminho", mas é um caminho; como mencionei as funções e variáveis, seu caminho é reuni-las e automatizá-las para fazê-las funcionar para você. (Este é o Emacs, mas para qualquer editor suficientemente avançado, uma postagem semelhante pode ser escrita.)

Eu disse que tenho as linhas visualmente agrupadas quando digito e nunca as quebro manualmente. Como sempre, há exceções: por exemplo, o GNUS não envia mensagens para a Usenet com linhas além de uma certa largura (em caracteres). Então, eu uso M-q. No Emacs, M-qexecuta o comando fill-paragraph. A variável fill-columncontrola a largura do preenchimento. Como exemplo, se eu escrever isso (em uma única linha)

This is a lot of text being written right now. The purpose is to overflow the line so I have have to line break it with M-q.

e depois uso o Mq, eu recebo

This is a lot of text being written right now. The purpose is to
overflow the line so I have have to line break it with M-q.

Com justify-current-line(duas vezes duas linhas), você obtém

This  is a lot  of text  being written  right now.  The purpose  is to
overflow  the  line  so  I  have  have to  line  break  it  with  M-q.

Mas descobri que as pessoas raramente usam fontes monoespaçadas para visualizar as coisas, por isso não fazia muito sentido usá-las (além do meu próprio prazer visual). Se você gosta, pode ajustar fill-paragraphpara preencher e justificar ao mesmo tempo. Você também pode ter Emacs fazer isso por você, sempre, enquanto você digita: auto-fill-mode. (Eu achei isso estressante, mas esse sou eu.)

Isso pode parecer muito trabalho, e é; mas assim que terminar (com isso e outras 1000 coisas), você poderá realmente gostar de trabalhar com as ferramentas que se comportam exatamente como você gosta.

Emanuel Berg
fonte