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
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
Respostas:
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
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
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'
$ 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
Também your_command | paste -sd ''preserva a nova linha à direita.
Se você deseja usar o Perl para isso, pode usar sua chompfunção:
perl -pe chomp
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.
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" }'
perl -wpe 'chomp; END { print "\n" } é o mesmo processo, pequena vantagem sobre a adição de eco à direita #
Usando o modo somente shell:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
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.
printf+cat+perlcombo é muito melhor tratado viaperl -pe 's/\n//;END{printf "\n"}' input.txtprocesso único, sem substituição de comando e mexendo com aspas, e sem UUOC. Possivelmente.