Extraindo bigramas com sed

3

Como faço para dividir um texto inteiro que consiste em apenas letras em bigramas.

Por exemplo:

ímpar mesmo

od -> de
dd -> ev

Isso é o que eu tenho até agora, mas não produz o resultado desejado.

[some source] | tail -n +30 | sed 's/[^A-Za-z\n]//g' | sed 's/\([A-Za-z]\)\([A-Za-z]\)\([A-Za-z]\)\([A-Za-z]\)\([A-Za-z]\)\{
od -> de
dd -> ev
,1\}/ -> , -> , /g' | sed 's/,/,\n/g'
    
por Robert Sundström 13.01.2012 / 15:21

2 respostas

3

Tente o próximo script sed :

Conteúdo de infile :

odd even
one test        of              bigrams

Conteúdo de script.sed :

## Inside square brackets there are two characters: space and tab.
## The instruction deletes them of the line.
s/[     ]*//g

## Label 'b'.
:b

## Copy line to 'hold space'.
h

## Get first bigram.
s/\(..\)\(..\).*/ -> /

## If last substitution succeed, continue to label 'a'.
ta

## Here last substitution failed: It means that line has less than four
## characters to extract a bigram, so read next line.
b

## Label 'a'
:a

## Print.
p

## Copy 'hold space' into 'pattern space'.
g

## Delete first character.
s/^.//

## Goto label 'b' to repeat loop.
tb

Execute o script:

sed -nf script.sed infile

Resultado:

od -> de
dd -> ev
de -> ve
ev -> en
on -> et
ne -> te
et -> es
te -> st
es -> to
st -> of
to -> fb
of -> bi
fb -> ig
bi -> gr
ig -> ra
gr -> am
ra -> ms
    
por 13.01.2012 / 16:42
-1

Isso pode funcionar para você:

echo -e "od\ndd\nde\nve" | 
sed '1{x;s/^/oddevenodd/;x};G;/^\(..\)\n.*\(..\).*/s// -> /'
od -> de
dd -> ev
de -> ve
ve -> no

É isso que você quer dizer?

echo -e "odd even\nthis and that" | 
sed 's/ //g;s/^\(..\)\(.*\)//;h;:a;s/^\(..\)\(..\).*/ -> /p;g;/^..../{s/^..//;h;ba};d'
od -> de
de -> ve
ve -> no
th -> is
is -> an
an -> dt
dt -> ha
ha -> tt
    
por 13.01.2012 / 16:13