Por que o tr-sc 'A-Za-z' '[\ 12 *]' inclui uma linha vazia?

1

Estou trabalhando no Unix For Poets e tentando criar um arquivo contendo todas as palavras / fichas na Bíblia . No entanto, ao usar tr, como sugerido, isso inclui a string vazia. Veja o exemplo abaixo:

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

The
Project
Gutenberg
EBook

Eu li a man page para tr, sem nenhuma sorte. Qualquer ajuda com a compreensão do porquê deles serem incluídos seria muito apreciada.

EDITAR:

Primeiro exemplo:

Linha do arquivo bible.txt:

1:1 Paul, a servant of Jesus Christ, called to be an apostle,

Comando que reproduz o resultado inesperado:

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

Paul
a
servant
of
Jesus
Christ
called
to
be
an
apostle

Resultado esperado:

Paul
a
servant
of
Jesus
Christ
called
to
be
an
apostle

Segundo exemplo:

Linha do arquivo bible.txt:

The Project Gutenberg Ebook of The King James Bible

Comando

com o mesmo resultado inesperado:

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

The
Project
Gutenberg
EBook
of
The
King
James
Bible

Resultado esperado:

The
Project
Gutenberg
EBook
of
The
King
James
Bible

Note que é a linha vazia do prefixo que não entendo.

    
por Ola R 02.07.2017 / 14:03

1 resposta

1

Você precisa entender as opções tr no trabalho aqui para saber o que está acontecendo.

  1. -c = > complementa o primeiro conjunto de caracteres. Significa que todos os caracteres não encontrados no primeiro conjunto de caracteres serão selecionados. No seu caso, 'A-Za-z' implicará qualquer não-alfabético como um espaço, um número, uma nova linha, um char de controle será escolhido.
  2. -s = > vários caracteres escolhidos consecutivos devem ser squashed como um.
  3. O segundo conjunto são os caracteres que devem ser mapeados. é o ascii octal para uma nova linha.

Isso significa que todos os alfabetos (maiúsculos e minúsculos) devem permanecer intocados, enquanto que os não alfabéticos serão transformados em uma única nova linha:

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

Todos os alfabetos não são tocados enquanto uma série de não-alfabetos múltiplos é transformada em novas linhas.

output:

This
is
StarWars
R
D
robot
work
    
por 02.07.2017 / 20:03

Tags