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のマニュアルページを読んだ。なぜ含まれているのか理解するのを手伝ってくれてありがとう。

編集する:

最初の例:

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

2番目の例:

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

私が理解できない空の行が前に付いていることに注意してください。

答え1

tr何が起こっているのかを知るには、ここで職業オプションを理解する必要があります。

  1. -c=> 最初の文字セットを補完します。つまり、最初の文字セットにないすべての文字が選択されます。あなたの場合、'A-Za-z'スペース、数字、改行、制御文字などのアルファベット以外の文字が選択されることを意味します。
  2. -ssquashed=>連続して選択された複数の文字は1つとして扱われます。
  3. 2番目のグループはマッピングする文字です。\12改行文字の8進数ASCII表現です。

つまり、すべての文字(大文字と小文字)は変更されずにそのまま残りますが、文字以外の文字は単一行になります。

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

すべての文字は変更されずに残りますが、一連の文字ではない文字は改行されます。


output:

This
is
StarWars
R
D
robot
work

関連情報