Sed e regex, mesmo padrão na mesma linha dois grupos diferentes?

0

Eu tenho alguns dados parecidos com isso:

BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue"

Os dados que eu quero usar neste caso são:

Harry<-George->Edna<-

Tom<-Tom->Phil<-

Meu comando, no momento, é assim:

sed 's!.*\(\([A-Z][a-z]*[-><][-<>]\)\{3\}\).*!!'

O que eu entendo é quando eu uso .* (ganancioso) leva a maior correspondência e então substitui tudo antes e depois.

Então minha saída no momento é apenas

Tom<-Tom->Phil<-

Como posso adicionar a primeira ocorrência do meu padrão em outro grupo?

    
por gel 01.12.2016 / 15:42

3 respostas

0

$ echo 'BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue' |
> sed -e 's/.*\b\(\w\+<-\w\+->\w\+<-\).*\b\(\w\+<-\w\+->\w\+<-\).*/\n/'
Harry<-George->Edna<-
Tom<-Tom->Phil<-
  • \b = limite de palavras
  • \w = caractere de palavra

A melhor introdução a sed pode ser encontrada em UNIX Grymoire de Bruce Barnett.

    
por 01.12.2016 / 16:08
0

Parece que você deseja corresponder letras, menor que, maior que, hífen, com pelo menos um hífen:

grep -Eo '[[:alpha:]<>-]+-[[:alpha:]<>-]+' <<END
BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue"
END
Harry<-George->Edna<-
<-Tom->Phil<-Tue
    
por 01.12.2016 / 19:22
0
echo 'BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue' |
sed -r '
s/(\b\w+<-\w+->\w+<-)([^\n])/\n/g  # seperate matchs with \n
s/.+(\b\w+<-\w+->\w+<-)//Mg          # remove the front in each lines
/\b\w+<-\w+->\w+<-$/!s/[\n]?[^\n]*$//' # remove the last unmatch line if exist
    
por 20.01.2017 / 08:23