Existe um método para imprimir saída com várias linhas (saída única) na mesma linha?
Por exemplo, se a saída for:
abc
def
qwerty
É possível imprimir:
abcdefqwerty
command-line
scripts
text-processing
Shrinidhi Kulkarni
fonte
fonte
printf
+cat
+perl
combo é muito melhor tratado viaperl -pe 's/\n//;END{printf "\n"}' input.txt
processo único, sem substituição de comando e mexendo com aspas, e sem UUOC. Possivelmente.Você pode canalizar sua saída multilinha através
awk
ou use
sed
:Exemplo de execução
Leitura adicional: remova a quebra de linha usando o AWK · serverfault.SE
fonte
Também
your_command | paste -sd ''
preserva a nova linha à direita.fonte
Se você deseja usar o Perl para isso, pode usar sua
chomp
função:Mais alguns detalhes, para quem estiver interessado.
Você pode passar um ou mais nomes de arquivos como argumentos subseqüentes.
Em alguns casos, você pode não querer fazer isso , mas pode canalizar ou redirecionar para esse comando. (Essas habilidades - e essa ressalva - se aplicam a qualquer outra solução
perl -p
ou comperl -n
base também.)Portanto, se você deseja processar a saída da execução
some-command
:Isso é potencialmente mais rápido que o comando Perl na resposta de terdon . Os caracteres de nova linha (representados por
\n
) aparecem apenas no final das linhas nesta situação - porque são eles que o Perl está usando para decidir onde cada linha termina.s/\n//
procura linhas novas por toda a linha, enquantochomp
apenas remove a linha no final (se houver, pois a última linha pode ou não ter uma).O desempenho pode não ser o principal motivo de preferência
chomp
. Operl
comando na resposta de Terdon seria apenas um pouco mais lento, a menos que você esteja processando um arquivo enorme com linhas muito longas. E se você precisa de velocidade, o caminho de David Foerster ainda é provavelmente mais rápido.chomp
é, no entanto, exatamente a ferramenta certa para isso, se você estiver usando Perl, e acho que a intenção dechomp
é mais clara que a des/\n//
. Em última análise, provavelmente não há uma resposta objetiva sobre qual é a melhor.Imprimindo uma nova linha final.
No entanto, eu recomendo o uso da substituição de comando (
$(
)
) apenas para garantir que uma nova linha final seja impressa. A menos que o texto que você está processando seja curto, é provável que seja bastante lento - ele precisa coletar todo o texto de uma só vez e depois imprimi-lo - e isso torna seu comando mais difícil de entender. Em vez disso, você pode fazer o que David Foerster sugeriu e executarecho
ouprintf '\n'
depois.Se você é tubulação de ou (como mostra David Foerster) reorientando a partir desse comando, então você pode colocá-lo no
{
;}
modo que a saída dos dois comandos é tomada em conjunto. Se você estiver imprimindo apenas no terminal, poderá executá-lo exatamente como mostrado acima. Isso funciona mesmo se você estiver canalizando ou redirecionando para o comando, porqueecho
/printf '\n'
na verdade não lê nenhuma entrada. Ou seja, isso funciona:Enquanto aqui você não pode simplesmente remover o
{
;}
:Ou, se preferir, você pode
perl
imprimir a nova linha final. Como colocando operl
eecho
comandos{
;}
, esta abordagem funciona mesmo se você estiver tubulação ou redirecionamento de ele (e, como todas as abordagens, isso funciona quando você está tubulação para isso, também):Observe que o comando na resposta de terdon também funciona bem com esses métodos de impressão da nova linha final. Por exemplo:
fonte
perl -wpe 'chomp; END { print "\n" }
é o mesmo processo, pequena vantagem sobre a adição de eco à direita #Usando o modo somente shell:
fonte
Esta resposta tem uma solução para o problema que você está tentando criar: Por que o bash remove \ n em $ (arquivo cat)?
Se você digitar
cat myfile.txt
, verá:Mas se você digitar
echo $(cat myfile.txt)
, verá:Observe que este método insere um espaço onde costumavam estar novas linhas separadas. Isso facilita a leitura da saída, mas não segue rigorosamente o escopo da sua pergunta.
fonte
Se você estiver usando o Bash, poderá fazê-lo sem nenhuma ferramenta externa.
Resultado:
O primeiro comando transforma a saída multilinha em uma matriz, o segundo comando expande a matriz em vários argumentos em uma linha.
fonte