Como posso imprimir saída com várias linhas na mesma linha?

16

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 
Shrinidhi Kulkarni
fonte

Respostas:

13

Você pode remover todas as ocorrências de caracteres de um determinado conjunto com tr -d. Para remover o caractere de nova linha, use:

tr -d '\n'

Como sempre, você pode usar redirecionamentos e pipes de entrada e saída para ler ou gravar em arquivos e outros processos.

Se você deseja manter a última nova linha, basta adicioná-la novamente com echoou printf '\n', por exemplo:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt
David Foerster
fonte
10

Várias maneiras. Para ilustrar, salvei seu exemplo em file:

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | perl -pe 's/\n//'
abcdefqwerty$ 

Isso remove todos os caracteres de nova linha, incluindo o último. Em vez disso, você pode querer fazer:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty
Terdon
fonte
Eu acho que o printf+ cat+ perlcombo é muito melhor tratado via perl -pe 's/\n//;END{printf "\n"}' input.txt processo único, sem substituição de comando e mexendo com aspas, e sem UUOC. Possivelmente.
Sergiy Kolodyazhnyy
7

Você pode canalizar sua saída multilinha através awk

awk '{printf "%s",$0} END {print ""}'

ou use sed:

sed ':a;N;$!ba;s/\n//g'

Exemplo de execução

$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'              
1234

Leitura adicional: remova a quebra de linha usando o AWK · serverfault.SE

sobremesa
fonte
4

Também your_command | paste -sd ''preserva a nova linha à direita.

Glenn Jackman
fonte
2

Se você deseja usar o Perl para isso, pode usar sua chompfunção:

perl -pe chomp

Mais alguns detalhes, para quem estiver interessado.

Você pode passar um ou mais nomes de arquivos como argumentos subseqüentes.

perl -pe chomp file1 file2 file3

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 -pou com perl -nbase também.)

Portanto, se você deseja processar a saída da execução some-command:

some-command | perl -pe chomp

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, enquanto chompapenas 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. O perlcomando 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 de chompé mais clara que a de s/\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 executar echoou printf '\n'depois.

perl -pe chomp; echo

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, porque echo/ printf '\n'na verdade não lê nenhuma entrada. Ou seja, isso funciona:

some-command | perl -pe chomp; echo

Enquanto aqui você não pode simplesmente remover o { ;}:

{ perl -pe chomp; echo; } | some-other-command

Ou, se preferir, você pode perlimprimir a nova linha final. Como colocando o perle echocomandos { ;}, 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):

perl -wpe 'chomp; END { print "\n" }'

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:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'
Eliah Kagan
fonte
perl -wpe 'chomp; END { print "\n" } é o mesmo processo, pequena vantagem sobre a adição de eco à direita #
Sergiy Kolodyazhnyy 17/03
1

Usando o modo somente shell:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt
Sergiy Kolodyazhnyy
fonte
1

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á:

abc
def
ghi

Mas se você digitar echo $(cat myfile.txt), verá:

abc def ghi

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.

WinEunuuchs2Unix
fonte
0

Se você estiver usando o Bash, poderá fazê-lo sem nenhuma ferramenta externa.

x=($(echo line1; echo line2))
echo "${x[@]}"

Resultado:

line1 line2

O primeiro comando transforma a saída multilinha em uma matriz, o segundo comando expande a matriz em vários argumentos em uma linha.

osexp2003
fonte