Unixシェルから印刷した後に行を変更する方法。次のように行を削除して書き換える\r
ことができますが、どのように既存の行を完全に削除せずに上書きし、次のように予想される出力を取得できますか?
注文する:
printf "12345";printf "\r67";
出力:
67
期待される出力
67345
答え1
コメントで議論したように、問題はカーソルを置く場所です。たとえば、
goldilocks@home> echo -n 1234; echo -ne "\r56"
56goldilocks@home>
最初はecho
「1234」を書き、2番目は行の先頭に戻り、「56」を印刷して終了します。カーソルは6の後ろに留まり、次にシェルはコマンドプロンプトを印刷して「34」を上書きします。 2番目のechoに改行文字を含めるか、-n
echoが自動的に改行文字を印刷するようにスイッチを削除すると、次の結果が表示されます。
goldilocks@home> echo -n 1234; echo -e "\r56"
5634
goldilocks@home>
カーソルが「34」を残し、1行下に移動します。
答え2
高度な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'