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 echo
ou 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 chomp
funçã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 -p
ou com perl -n
base 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 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 de preferência chomp
. O perl
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 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 echo
ou 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 perl
imprimir a nova linha final. Como colocando o perl
e echo
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):
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
+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.