Como posso imprimir a saída de múltiplas linhas na mesma linha?

13

Existe um método para imprimir uma saída de várias linhas (saída única) na mesma linha?

Por exemplo, se a saída for:

abc
def
qwerty

É possível imprimir:

abcdefqwerty 
    
por Shrinidhi Kulkarni 22.12.2017 / 14:54

8 respostas

12

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

tr -d '\n'

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

Se você quiser manter a última nova linha, basta adicioná-la novamente com echo ou printf '\n' , e. g .:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt
    
por David Foerster 22.12.2017 / 15:02
10

Muitas 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. Você pode querer fazer:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty
    
por terdon 22.12.2017 / 15:03
7

Você pode enviar sua saída multilinha por meio de 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

Outras leituras: remove a quebra de linha usando o AWK · serverfault.SE

    
por dessert 22.12.2017 / 15:02
4

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

    
por glenn jackman 23.12.2017 / 00:53
2

Se você quiser usar o Perl para isso, você pode usar sua função chomp :

perl -pe chomp

Mais alguns detalhes, para quem estiver interessado.

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

perl -pe chomp file1 file2 file3

Em alguns casos, talvez você não queira fazer isso , mas você pode redirecionar ou redirecionar para esse comando. (Essas habilidades - e essa limitação - também se aplicam a qualquer outra solução baseada em perl -p ou perl -n .)

Então, se você quiser 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 . Caracteres newline (representados por \n ) só aparecem no final das linhas nessa situação - porque eles são o que Perl está usando para decidir onde cada linha termina. s/\n// pesquisa a linha inteira para novas linhas, enquanto chomp 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 para preferir chomp . O comando perl 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. O chomp é, no entanto, exatamente a ferramenta certa para isso, se você estiver usando Perl, e eu acho que a intenção de chomp é mais clara do que a de s/\n// . Em última análise, provavelmente não há uma resposta objetiva sobre qual é o melhor.

Imprimindo uma nova linha final.

No entanto, eu recomendo contra o uso de substituição de comando ( $( ) ) apenas para garantir que uma nova linha seja impressa. A menos que o texto que você está processando seja curto, é provável que seja bem lento - ele precisa coletar todo o texto de uma só vez e depois imprimi-lo - e torna seu comando mais difícil de entender. Em vez disso, você pode fazer como David Foerster sugeriu e executar echo ou printf '\n' depois.

perl -pe chomp; echo

Se você estiver canalizando de ou (como mostra David Foerster) redirecionando de esse comando, você pode colocá-lo em { ;} para que o saída de ambos os comandos é tomada em conjunto. Se você está apenas imprimindo no terminal, você pode executá-lo exatamente como mostrado acima. Isso funciona mesmo se você estiver canalizando ou redirecionando para o comando, porque echo / printf '\n' realmente 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 fazer perl imprimir a nova linha final em si. Como incluir os comandos perl e echo em { ;} , essa abordagem funciona mesmo se você estiver canalizando ou redirecionando de (e, como todos abordagens, isso funciona quando você está canalizando para , também):

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

Observe que o comando in terdon's answer funciona bem com esses métodos de impressão da nova linha final também. Por exemplo:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'
    
por Eliah Kagan 17.03.2018 / 17:48
1

Esta resposta tem uma solução para o problema que você está tentando criar: Por que o bash remove \ n no $ (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 costumava haver novas linhas separadas. Isso torna a saída mais fácil de ler, mas não segue estritamente o escopo da sua pergunta.

    
por WinEunuuchs2Unix 17.03.2018 / 20:24
1

Usando o modo somente shell:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt
    
por Sergiy Kolodyazhnyy 17.03.2018 / 19:21
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 de múltiplas linhas em uma matriz, o segundo comando expande a matriz em vários argumentos em uma linha.

    
por 03.07.2018 / 09:13