Para responder à pergunta no título:
command that will take a file and separate each word so its on its own line
Você poderia fazer:
<file tr '\n\t\r' ' '' '' ' | tr -s ' ' '\n' # needs three spaces !
Ele irá converter novas linhas, tabulações e retornos de carro para espaços e, em seguida,…
converter qualquer execução ( -s
) de espaços de volta para uma nova linha.
Você pode aproveitar o comando tr e usá-lo para também converter letras maiúsculas em minúsculas na mesma chamada:
<file tr '[:upper:]\n\t\r' '[:lower:] ' | tr -s ' ' '\n'
Ou você pode fazer exatamente o mesmo no GNU sed (lembre-se de que isso vai sugar todo o arquivo para a memória e assume que não existem bytes NUL dentro do arquivo):
<file sed -zE -e 'y/A-Z\n\t\r/a-z /;s/ +/\n/g'
Em seguida, para responder à pergunta no corpo:
(a word is defined to be a contiguous sequence of letters, so 1 letter words don't count) and to remove all blank lines.
você pode remover palavras com caracteres diferentes de a-z, palavras de um caractere e linhas vazias:
sed -E '/[^a-z]/d;/^.$/d;/^$/d'
Poderia ser reduzido para um pouco mais enigmático:
sed -E '/[^a-z]/d;/^(.|)$/d'
Tudo em uma linha:
<file tr '[:upper:]\n\t\r' '[:lower:] ' | tr -s ' ' '\n' | sed -E '/[^a-z]/d;/^(.|)$/d'
Ou:
<file sed -zE -e 'y/A-Z\n\t\r/a-z /;s/ +/\n/g' | sed -E '/[^a-z]/d;/^(.|)$/d'
Versão comentada (funciona no GNU sed):
# Source 'file' and use sed with the 'zero' option (-z) and Extended Regex (ERE '-E')
<file sed -zE -e '
# Transliterate (-y) UPPER to lower and convert control to space.
y/A-Z\n\t\r/a-z /
# Restore consecutive spaces to **one** newline.
s/ +/\n/g
# Second call to sed.
' | sed -E '
# Delete (d) lines that have nay character not in the range a-z.
/[^a-z]/d
# delete any line with one character or empty.
/^(.|)$/d
'