Como eu adiciono uma declaração if (referente a pontuação em uma palavra) neste script bash?

2

Eu tenho este script bash

#!/bin/bash
cat $@ | while read line
do
    for word in $line
    do
        echo $word | circling-the-square
        # here's where i need to add the if statement:
        #if the word contains one of the four [!?.,],
        #then also echo that punctuation mark
    done
done

circling-the-square é um script Python baseado no corretor ortográfico da Norvig.

Esse script livra sua entrada de pontuação

def words(text): return re.findall('[a-z]+', text.lower()) 

então preciso de bash para perceber isso. Eu acho que sed ou awk pode ser útil, mas eu ainda não sei como escrever esse regex ou colocá-lo em uma instrução if, então estou perguntando isso aqui.

Como está, passando o arquivo

alec@ROOROO:~/oddi-o/newton-fluxions$ cat 199
 advertisement lately publijtid by the author, the british hemisphere, or a map of a new contrivance, proper for initiating young minds in the firft rudiments of geography, and the ufe of the globes.

alec@ROOROO:~/oddi-o/newton-fluxions$ ./hmmb 199
advertisement
lately
publijtid

by
the
author
the
british
hemisphere
or
a
map
of
a
new
contrivance
proper
for
initiating
young
minds
in
the
first
rudiments
of
geography
and
the
few
of
the
globes.

O que não é perfeito, mas ainda é útil. FYI , editei o arquivo em questão para conter apenas \w e a pontuação [!?.,] . O arquivo não contém caracteres como: ou;, então, eu preciso deles para ecoar esses quatro sinais de pontuação, se forem incluídos como parte de uma palavra, a saber:

alec@ROOROO:~/oddi-o/newton-fluxions/finforno$ ./hmmb 199
advertisement
lately
publijtid
by
the
author,
the
british
hemisphere,
or
a
map
of
a
new
contrivance,
proper
for
initiating
young
minds
in
the
firft
rudiments
of
geography,
and
the
ufe
of
the
globes.
    
por ixtmixilix 24.05.2012 / 19:28

2 respostas

3

Use um regex como mostrado abaixo. Encontra palavras contendo um ou mais dos seus sinais de pontuação especificados e imprime a palavra e o primeiro sinal de pontuação correspondente. Você pode estendê-lo como quiser.

if [[ "$word" =~ ^.*([!?.,])+.*$ ]]
then
    echo "Found word: $word containing punctuation mark: ${BASH_REMATCH[1]}"
fi
    
por 25.05.2012 / 10:10
1

Parece que o basex regex pode ajudar. Discussão sobre o Stackoverflow sobre o tópico: link

    
por 24.05.2012 / 19:33