Embora sed seja a escolha óbvia, outro candidato muito confiável pode ser dd .
Provavelmente é mais útil para situações em que a contagem de bytes é mais importante do que a contagem de linhas, mas block ing e desbloqueio dados é o que faz melhor:
seq 10| dd cbs=16 conv=block
1 2 3 4 5 6 7 8 9 10
Isso, até agora, é mais como alcançar o oposto do que você pediu, mas dd pode bloquear linhas em espaços - ele converterá entrada \n ewlines em espaços e pad essas linhas em cbs=[num] bytes de espaços. E assim, se você puder prever com segurança um comprimento máximo de bytes por linha (porque adivinhar muito baixo resultará em truncamento) , e então dobrar esse número ...
seq 10| dd cbs=16 conv=block | dd cbs=8 conv=unblock
1
2
3
4
5
6
7
8
9
10
... você pode então desbloquear a metade do cbs - que irá aparar espaços à direita e imprimir \n ewline a cada cbs=[num] bytes. Isso é muito mais útil para lidar com grandes volumes de dados possivelmente binários (ou para entrada de terminal) do que seria para arquivos de texto comuns, mas é uma alternativa - e pode competir definitivamente (em larga escala) no departamento de performance com praticamente qualquer coisa.
Outra alternativa especializada pode ser nl e tr . Isso só seria útil se sua entrada se assemelha à mostrada - porque a solução envolve tr anslating espaços em \n ewlines. Em qualquer caso, nl sempre insere pelo menos -w idth + 1 bytes de espaços na cabeça de cada linha pela qual é passado - independentemente de os numerar ou não. E assim você pode ...
printf %s\n a b c d e |
nl -bn |
tr -s \ \n
... que imprime:
a
b
c
d
e
A opção -bn instrui nl não a numerar o corpo de sua entrada, mas ainda insere 6 espaços por padrão - e pelo menos dois pares com um argumento -w1 . Isso pode torná-lo útil para outros casos também - como ...
INPUT |nl -bn -w1 |sed '/address/s/ //...' | sed '/^ /!...'
... em que o segundo sed sempre sabe quais linhas o primeiro tocou. Mas eu discordo ...
De qualquer forma, tr -s queezes todas as sequências de entrada de espaços em um único byte e tr anslates cada resultado em um \n ewline. Sem a opção -s , haveria seis novas ewlines \n intervenientes entre cada alfabético acima. E isso pode ser definido com segurança tão facilmente quanto -w1 .
Ainda assim, eu usaria sed . E por falar nisso, embora os comandos G et e i nsert já tenham sido mencionados, há também os comandos a ppend e c hange para isso. Qualquer um dos dois ficaria assim:
printf %s\n a b c d e|
sed 'a\
'
a
b
c
d
e
sed G funciona porque G ets o conteúdo do buffer H old anexado ao buffer de padrão após um \n ewline. H old space é, por padrão, vazio e, portanto, tudo que você obtém é um \n ewline. Mas, se houver mais no script sed e o buffer H old não estiver vazio , você poderá sempre a ppen em qualquer cadeia em qualquer linha, senão você pode p rint a linha então c altere na saída como:
INPUT| sed '...;p;c\
'
... com GNU sed a nova linha atual não é necessária para i , c ou a e todos os três podem ser usados como sed '[aic]\' , embora talvez isso seja um mau hábito a ser adotado. Em qualquer caso, qualquer um desses três é provavelmente menos dispendioso do que um s/// ubstitution porque nenhum implica um padrão de regex, embora eu duvide que a diferença seja significativa.