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:
-
s/[[:punct:]]//g
remove todos os caracteres de pontuação. -
s/.*/\L&/
converte todos os caracteres maiúsculos em minúsculas. -
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]*\).*//'