在unix shell中打印后如何修改一行。我们可以删除该行并使用\r
如下所示再次写入,但是如何覆盖现有行而不完全删除它并获得如下预期输出中的输出。
命令:
printf "12345";printf "\r67";
输出:
67
预期输出
67345
答案1
正如评论中所讨论的,问题在于您离开光标的位置。例如:
goldilocks@home> echo -n 1234; echo -ne "\r56"
56goldilocks@home>
发生的情况是第一个echo
写入“1234”,然后第二个回显回到行的开头并打印“56”并退出。光标停留在 6 之后,接下来发生的事情是 shell 打印命令提示符,覆盖“34”。如果您在第二个 echo 中包含换行符(或删除开关-n
,以便 echo 自动打印换行符),您将得到:
goldilocks@home> echo -n 1234; echo -e "\r56"
5634
goldilocks@home>
光标向下移动一行,留下“34”。
答案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'