打印后覆盖 unix shell 中的行

打印后覆盖 unix shell 中的行

在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'

相关内容