Como envolver duas linhas em uma única linha com delimitador

6

Eu executei abaixo do comando

cat /proc/loadavg && date

Resultado real:

0.00 0.00 0.00 1/803 26256
Fri Aug 26 09:00:56 EEST 2016

Resultado esperado:

0.00 0.00 0.00 1/803 26256 @@ Fri Aug 26 09:00:56 EEST 2016

Eu tentei sed e tr , mas não funcionou.

cat /proc/loadavg && date | sed 's/\n/ @@ /g'

cat /proc/loadavg && date | tr '\n' ' @@ '

Alguma ideia, o que eu sinto falta?

    
por Spike 26.08.2016 / 08:57

7 respostas

15

Sua melhor aposta é usar printf . Você tem duas strings e deseja gerá-las com alguma formatação adicional. Isso é exatamente o que o printf faz.

$ printf "%s @@ %s\n" "$(cat /proc/loadavg)" "$(date)"

Sua tentativa tr não funciona, pois tr modifica caracteres , não palavras. Você poderia usá-lo para substituir as novas linhas por um único caractere:

$ ( cat /proc/loadavg; date ) | tr '\n' '@'

... mas não faz exatamente o que você precisa.

Sua sed tentativa não funciona, pois a nova linha é removida da entrada para sed (ou seja, sed -n '/\n/p' inputfile nunca imprime nada).

Ainda é possível fazer isso com sed se você ler a segunda linha (de date ) com o comando N editando a primeira linha (que irá colocar uma nova linha entre eles):

$ ( cat /proc/loadavg; date ) | sed 'N;s/\n/ @@ /'

... mas eu pessoalmente preferiria a solução printf .

    
por 26.08.2016 / 09:09
8

Você pode fazer isso:

echo 'cat /proc/loadavg' @@ 'date'
    
por 26.08.2016 / 17:55
7

Assim:

( cat /proc/loadavg && date ) | sed 'N; s/\n/ @@ /'

Primeiro, suas tentativas não funcionam porque o canal | se aplica somente a date , e não há o comando both. Para contornar isso, você precisa executar cat ... && date em um subshell e, em seguida, redirecionar o stdout do subshell.

Então tr '\n' ' @@ ' não funciona porque você não pode substituir um caractere por vários caracteres.

E sed 's/\n/ @@ /g' não funciona porque sed só consegue ver as linhas uma de cada vez. Para obtê-lo para ver novas linhas, você precisa mesclar as duas linhas de entrada no mesmo buffer. Qual é o N acima.

    
por 26.08.2016 / 09:08
3

Isso pode ajudá-lo,

( cat /proc/loadavg && date ) | awk 'ORS=" @@ "'
    
por 26.08.2016 / 09:08
2

Apenas para algo diferente ...

(cat /proc/loadavg && date) | paste -d@ - - | sed 's/@/ @@ /' 

paste -d@ - - cola as duas linhas lado a lado com "@" no meio. Então sed substitui o single "@" por "@@"

    
por 26.08.2016 / 22:52
1

A filtragem extra que você está fazendo para remover a nova linha está sendo aplicada apenas ao comando date , portanto tente

{ cat /proc/loadavg && date; } | tr -d '\n'
    
por 26.08.2016 / 09:04
0

Que tal isso?

export DELIMITER=' @@ '; cat /proc/loadavg | tr -d '\n'; echo -n "$DELIMITER" && date

Saída: 0.34 0.39 0.40 1/1065 29353 @@ Fr 26. Aug 09:30:26 CEST 2016

Ele apenas remove a nova linha após a saída de linha por cat, ecoa uma string de delimitador sem uma nova linha (-n) e finalmente anexa a saída de data.

    
por 26.08.2016 / 09:32