web-dev-qa-db-ja.com

印刷後のUNIXシェルの行の上書き

UNIXシェルで印刷した後に行を変更するにはどうすればよいですか。以下に示すように\rを使用して行を削除して再度書き込むことができますが、既存の行を上書きして完全に削除せずに出力を取得するにはどうすればよいですか。以下の期待される出力で。

コマンド:

printf "12345";printf "\r67";

出力:

67

期待される出力

67345
4
g4ur4v

コメントで説明されているように、問題はカーソルをどこに置いたかです。例えば:

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

最初にechoが「1234」と書き込んだ後、2番目のエコーが行の先頭に戻って「56」と出力されて終了しました。カーソルは6の後も残り、次に発生したのは、シェルがコマンドプロンプトを出力して「34」を上書きしたことです。 2番目のエコーに改行を含めた場合(または、エコーが改行を自動的に出力するように-nスイッチを削除した場合)、次のようになります。

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

カーソルが1行下に移動し、「34」が残りました。

7
goldilocks

少し高度なsed式を使用してこれを行うことができます

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

awkの使用

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

trの使用

printf '%s' {1..5} | tr '12' '67'
3