extrai parte de uma linha antes e depois de uma string

1

linha de exemplo:

04/07/2016 11:23:44 [8344] BDFDD123A Some Text Here (Word: ABD_ABDCD, Word: Word, Word: Word Word-ABCAbcAbc-HOSTNAME.DOMAINNAME.COM-ASDF).

Gostaria de extrair a parte "HOSTNAME.DOMAINNAME.COM-ASDF".

Existe sempre um "-" antes da parte "HOSTNAME" e a linha termina sempre com "." mas nem sempre ")".

Parece que se eu pudesse dizer para cada linha 1.) encontre a string ".COM" 2.) então volte ao anterior "-" e avance para o próximo "." e me dá tudo no meio que funcionaria ... mas eu não tenho ideia de como fazer isso.

Normalmente, eu tentaria dividir por algum tipo de separador, mas não é o mesmo número de separadores para cada linha. alguma ideia de como lidar com isso?

    
por Fred 05.07.2016 / 03:30

2 respostas

1

Usando grep com PCRE ( -P ):

grep -Po -- '-\K[^-]+\..*?(?=(?:\)|)\.$)' file.txt
  • - corresponde a - e \K descarta a correspondência

  • [^-]+\..*? corresponde à subcadeia desejada

  • O padrão lookahead positivo de largura zero (?=(?:\)|)\.$) garante que a correspondência seja seguida por ). ou apenas . no final da linha.

Exemplo:

$ grep -Po -- '-\K[^-]+\..*?(?=(?:\)|)\.$)' <<<'04/07/2016 11:23:44 [8344] BDFDD123A Some Text Here (Word: ABD_ABDCD, Word: Word, Word: Word Word-ABCAbcAbc-HOSTNAME.DOMAINNAME.COM-ASDF).'
HOSTNAME.DOMAINNAME.COM-ASDF
    
por 05.07.2016 / 03:40
0

Se você quiser manter a parte -ASDF, então

sed -E 's/.*-(.*-[^)]*)\)?\.$//'

Se você não se importa com a parte -ASDF, então é mais simples

sed 's/.*-\(.*\)-.*//' x   

Isso funciona sendo "ganancioso" no primeiro .*

    
por 05.07.2016 / 03:39