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.