Tr

為什麼 tr -sc ‘A-Za-z’ ‘12∗12∗12*’ 包括空行?

  • July 2, 2017

我正在通過Unix For Poets工作,並嘗試製作一個包含聖經中所有單詞/標記的文件。但是,按照建議使用 tr 時,這包括空字元串。請參見下面的範例:

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

The
Project
Gutenberg
EBook

我已經閱讀了 tr 的手冊頁,但沒有任何運氣。任何有助於理解為什麼包含它們的幫助將不勝感激。

編輯:

第一個例子:

來自 bible.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

第二個例子:

來自 bible.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

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

您需要了解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

引用自:https://unix.stackexchange.com/questions/374776