Linha de sobregravação no shell unix após a impressão

4

Como posso modificar uma linha depois de imprimi-la no shell unix. Podemos excluir a linha e escrever novamente usando \r como mostrado abaixo, mas como posso substituir na linha existente e não excluí-la completamente e obter a saída como na saída esperada abaixo.

Comando:

printf "12345";printf "\r67";

Saída:

67

Resultado esperado

67345
    
por g4ur4v 28.08.2013 / 16:32

2 respostas

7

Como discutido nos comentários, o problema é onde você deixou o cursor. Por exemplo:

goldilocks@home> echo -n 1234; echo -ne "\r56"
56goldilocks@home>

O que aconteceu é o primeiro echo escreveu "1234", então o segundo eco voltou ao início da linha e imprimiu "56" e saiu. O cursor permaneceu após o 6, e a próxima coisa que aconteceu foi que o shell imprimiu o prompt de comando, sobrescrevendo "34". Se você incluiu uma nova linha no segundo eco (ou removeu a opção -n , para que o eco imprima uma nova linha automaticamente), você obteria:

goldilocks@home> echo -n 1234; echo -e "\r56"
5634
goldilocks@home>

O cursor moveu-se para baixo de uma linha, deixando o "34" para trás.

    
por 28.08.2013 / 18:02
3

Você pode fazer isso usando um pouco de expressão sed avançada

printf '%s\n' {1..5} | sed '/1/,/2/{ s/1/6/;s/2/7/;s/\([^\n]*\)\(\n\)\(.*\)//; }' | tr '\n' ' '

Usando awk

printf '%s' {1..5} | awk '{gsub(/12/,"67"); print}'

Usando tr

printf '%s' {1..5} | tr '12' '67'
    
por 28.08.2013 / 16:49