\ b,\ f,\ n,\ r是做什么的?有什么区别?

时间:2016-03-10 22:38:59

标签: escaping

我想知道一些转义序列是做什么的,包括以下内容:

\b backspace
\f form feed
\n new line
\r carriage return
\t tab

此外,换页,换行和回车有什么区别? \ t和空格有什么区别?它们看起来都一样......

1 个答案:

答案 0 :(得分:1)

您可以使用printf测试这些转义序列,例如在C程序中或使用Unix / Linux shell(如Bash),如下所示。

  • 退格会导致光标向前移动前一个字符
  • 表单提要通常仅用于打印机以使当前页面被输出,因此下一页是当前页面
  • 新行(换行符)会使光标移动到下一行。在与Unix相关的系统上,这也会导致光标移动到该行的开头。
  • 回车会使光标移动到当前行的开头。在使用Windows(或MS-DOS)或其亲属(尤其是其控制台)的系统上,回车符和换行符的组合用于新行。
  • 标签会使光标移动到下一个标签停止位置,该位置通常以四个或八个字符位置的间隔设置。它可用于在列中排列数据。但请注意,printf使用的字符串格式更加可靠,因为使用制表符仍然会导致交错的列。请参阅本答复底部的示例。
  • 空格将光标向前移动一个位置(与退格相反)。请注意,在终端(屏幕上)空间通常是破坏性的 - 也就是说,如果角色位于光标移动的位置,则该角色将被删除。当在另一个角色存在的位置打印一个空格以外的新角色时,会发生同样的事情(如下面的退格示例所示)。

$表示shell提示符,不应键入。包含它是为了区分您键入的内容和输出内容。我在每个字符串的末尾添加了换行符\n,因此输出占用了自己的行。

$ printf 'help\blo - backspace\n'
hello - backspace
$ printf 'two\nlines - newline\n'
two
lines - newline
$ printf 'clocks - carriage return\rsla\n'
slacks - carriage return
$ printf 'Fruit\tColor\tQuantity\ngrapes\tgreen\t100\nbananas\tyellow\t50\n- tabs\n'
Fruit   Color   Quantity
grapes  green   100
bananas yellow  50
- tabs

有关详细信息,请参阅ASCII Control Characters

尝试此操作,了解printf格式如何改进标签:

$ array=(A B C 'apple pie' 'banana split' 'cherry turnover' 100 200 300)
$ for ((i=0; i<12; i+=3)); do printf '%s\t%s\t%s\n' "${array[@]:i:3}"; done
A       B       C
apple pie       banana split    cherry turnover
100     200     300
$ for ((i=0; i<12; i+=3)); do printf '%-16s%-16s%s\n' "${array[@]:i:3}"; done
A               B               C
apple pie       banana split    cherry turnover
100             200             300

如您所见,第二个版本中的列没有交错,整体输出宽度相同。