Extrai palavras-chave da linha

1

Eu preciso extrair padrões semelhantes dos dados abaixo. O padrão começa com '.' ou '' então para a palavra-chave que eu quero, seguida por ''. Podemos assumir que o formato é

  1. números LSUFE_
  2. números de PCRF _

Dados de amostra

/home/mobaxterm/Data/FW/FW3/FW.3.1/releases/patch_PCRF-17717B1.jar,patch_PCRF-17717B1.jar,yschew,2015-10-21 11:31:58.000000000,patch
/home/mobaxterm/Data/FW/FW9/CW.1/releases/D/patch_FW_9.3.1.LSUFE-583B1_i86pc.jar,patch_FW_9.3.1.LSUFE-583B1_i86pc.jar,yschew,2015-10-21 11:31:58.000000000,patch,i86pc

Saída desejada

LSUFE-583B1
PCRF-17717B1

Eu tentei usar a resposta de link

sed -r 's/.*LSUFE-(\S+).*//'

mas não funcionou, tudo o que tenho é uma tela em branco. Agora o que estou pensando é fazer algo parecido com isso

sed -e 's/LSUFE-*/,/\_/' output.txt

mas, é claro, não consegui que funcionasse, minha ideia é fazer isso de 1 em 1 para cada padrão, ler do padrão correspondente até encontrar um sublinhado.

    
por Xeon 23.10.2015 / 04:32

2 respostas

2

Você poderia usar algo assim:

$ grep -oE '(LSUFE|PCRF)-[^._]*' input.txt  | uniq
PCRF-17717B1
LSUFE-583B1

O uniq é necessário porque cada linha contém o caminho completo para o nome do arquivo do patch e o nome da base (ou seja, sem o caminho).

Como alternativa, se a ordem da saída não for importante, você poderá usar sort -u em vez de uniq - isso também eliminará quaisquer duplicatas que ocorram em várias linhas da entrada.

Aqui está outra alternativa no perl:

perl -F, -a -e 'next unless $F[1] =~ s/.*((LSUFE|PCRF)-[^._]*).*/$1/  ; print $F[1],"\n"' input.txt

Isso realiza a pesquisa de expressão regular e substitui apenas o campo 2 ( $F[1] em perl, pois as matrizes perl são baseadas em zero) e, em seguida, imprime o campo 2.

Esta versão perl anexa o texto correspondente como um campo extra ao final da linha de entrada:

perl -F, -a -e 'chomp ; next unless $F[1] =~ s/.*((LSUFE|PCRF)-[^._]*).*/$1/ ; print $_,",",$F[1],"\n"' input.txt 

Ele usa chomp() para remover o \n da linha de entrada, depois imprime a linha de entrada ( $_ ), uma vírgula, o campo modificado 2 e uma nova linha.

    
por 23.10.2015 / 05:09
0

Apenas a informação capturada

sed  's/.*\(LSUFE-\([^_.]*\)[_.].*//' YourFile

catched adicionado ao final com , como separador

sed  's/.*\(LSUFE-\([^_.]*\)[_.].*/&,/' YourFile

Com vários padrões de uma só vez

sed  -e 's/.*\(LSUFE-\([^_.]*\)[_.].*//' -e 's/.*\(PCRF-\([^_.]*\)[_.].*//' YourFile

com o GNU sed

sed 's/.*\(\(LSUFE\|PCRD\)-\([^_.]*\)[_.].*//'
    
por 23.10.2015 / 09:23

Tags