为什么 tr -sc 'A-Za-z' '[\12*]' 包含空行?

为什么 tr -sc 'A-Za-z' '[\12*]' 包含空行?

我正在努力通过诗人的 Unix,并尝试创建一个包含所有单词/标记的文件圣经。但是,当使用 tr 时,如建议的那样,这包括空字符串。请参阅下面的示例:

> tr -sc 'A-Za-z' '[\12*]' < bible.txt > bible.words
> sed 5q bible.words

The
Project
Gutenberg
EBook

我已经通读了 tr 的手册页,但没有任何运气。任何有助于理解为什么包含它们的帮助将不胜感激。

编辑:

第一个例子:

圣经.txt 中的行:

1:1 耶稣基督的仆人保罗,蒙召为使徒,

重现意外结果的命令:

> echo '1:1 Paul, a servant of Jesus Christ, called to be an apostle,' | tr -sc 'A-Za-z' '[\12*]'

Paul
a
servant
of
Jesus
Christ
called
to
be
an
apostle

预期输出:

Paul
a
servant
of
Jesus
Christ
called
to
be
an
apostle

第二个例子:

圣经.txt 中的行:

古腾堡计划英王钦定本圣经电子书

命令具有相同的意外结果:

echo 'The Project Gutenberg EBook of The King James Bible  ' | tr -sc 'A-Za-z' '[\12*]'

The
Project
Gutenberg
EBook
of
The
King
James
Bible

预期输出:

The
Project
Gutenberg
EBook
of
The
King
James
Bible

请注意它的前缀空行我不明白。

答案1

您需要了解tr这里的工作选项才能知道发生了什么。

  1. -c=> 补足第一个字符集。意味着,将选择第一个字符集中未找到的任何字符。在您的情况下,'A-Za-z'将意味着将选择任何非字母字符,如空格、数字、换行符、控制字符。
  2. -s=> 多个连续选择的字符将squashed作为一个。
  3. 第二组是要映射到的字符。\12是换行符的八进制 ascii。

这意味着所有字母(大写和小写)都将保持不变,而非字母的运行将变成单个换行符:

     ----     --        --------     -     -       -----      ----
$#%! This     is        StarWars     R2    D2      robot     @work.
|---|    |---|  |------|        |---| |---| |-----|     |----|    ||
 \n        \n      \n             \n    \n     \n         \n      \n 

所有字母都保持不变,而一系列非字母则变成换行符。


output:

This
is
StarWars
R
D
robot
work

相关内容