Explicação do sed no shell script

1

Encontrei um trecho de código on-line que realmente ajudaria a criar a frequência de cada palavra em um arquivo de texto. No entanto, gostaria que alguém explicasse exatamente como está sendo feito

Especialmente o comando sed, já que sou super novo para bater e preciso saber o que todos os operadores estão fazendo ( s/\(.*\)/\L/ ).

Aqui está o código:

cat EnglishText.txt
sed 's/\.//g;s/\(.*\)/\L/;s/\ /\n/g' EnglishText.txt | sort | uniq -c

Eu quero saber o que exatamente vem depois do sed, eu entendo o uniq -c e o tipo, mas eu gostaria de saber o que está acontecendo na correspondência e assim por diante ... Eu sei que isso é de alguma forma estranho, mas novamente Eu sou muito novo para isso

No mesmo contexto da pergunta

sed  's/\([0-9]*\).*//'

O que isso significaria?

    
por JavaFreak 20.06.2016 / 03:44

1 resposta

4

O script sed consiste em três comandos substitutos. Os comandos substitutos têm o formato s/old/new/ , que procura algo no texto que corresponda à expressão regular old e o substitui por new . Se um g for colocado após o comando, essa substituição será feita repetidamente ("globalmente"). O primeiro remove os períodos. O segundo faz o texto em minúsculas. O terceiro coloca cada palavra em sua própria linha. Mais detalhadamente:

  • s/\.//g

    Isto corresponde períodos na entrada e substitui-os por nada.

  • s/\(.*\)/\L/

    Isso corresponde a qualquer coisa na entrada e a substitui por uma versão minúscula do mesmo.

  • s/\ /\n/g

    Isso substitui espaços por novas linhas. Isso tem o efeito de colocar cada palavra em uma linha separada.

Exemplo

Observe que o período é removido e todas as palavras são minúsculas e colocadas em linhas separadas:

$ echo 'This test is this test.' | sed 's/\.//g;s/\(.*\)/\L/;s/\ /\n/g'
this
test
is
this
test

Este formulário é adequado para classificação e contagem:

$ echo 'This test is this test.' | sed 's/\.//g;s/\(.*\)/\L/;s/\ /\n/g' | sort | uniq -c
      1 is
      2 test
      2 this

Melhoria

O script sed , conforme escrito, não faz nada com outras pontuações, como ?"! ou com guias. Com pequenas modificações no código acima, tudo pode ser manipulado:

$ echo 'This "test(?)" is this test!' | sed 's/[[:punct:]]//g; s/.*/\L&/; s/[[:space:]]/\n/g' | sort | uniq -c
      1 is
      2 test
      2 this

Isso usa o mesmo tipo de comando substituto do original com apenas pequenas alterações:

  1. s/[[:punct:]]//g remove todos os caracteres de pontuação.

  2. s/.*/\L&/ converte todos os caracteres maiúsculos em minúsculas.

  3. s/[[:space:]]/\n/g substitui todo o espaço em branco por caracteres de nova linha.

Adendo

Se uma linha começar com um número, sed 's/\([0-9]*\).*//' manterá esse número e removerá tudo depois dele. Todas as outras linhas são removidas. Por exemplo:

$ echo '123 tests' | sed  's/\([0-9]*\).*//'
123
$ echo 'There are 123 tests' | sed  's/\([0-9]*\).*//'
    
por 20.06.2016 / 04:06

Tags