Como os valores em que você está interessado parecem divididos em várias linhas, eu confiaria em um regexp perl puro para corresponder aos padrões corretos:
cat file.txt | perl -e 's/\s//g && print "$_\n" for join("", <>) =~ /\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gm'
Observação: suponho que os valores que você está procurando terminam com este delimitador:
XXX**TP em que XXX pode ser RSS ou SNA no seu exemplo.
Como funciona
-
join("", <>)está criando uma única string a partir do resultado do comandocat -
que eu uso para analisar (o operador
=~) usando essa expressão regular:/\*([\w\s]+)[~]{0,1}\w{3}\*\*TP/gmEste regexp procura por strings começando com uma estrela
\*e feita de caracteres [A-Za-z0-9_] (o atalho é\wpara palavras) e espaços\s, um possível~(0 ou 1 vez) e, em seguida, 3 caracteres de palavras (por exemplo:RSSouSNA), duas estrelas\*\*seguido porTP.Os parênteses são usados para capturar apenas o padrão entre eles.
/gmsão modificadores regexp, em quegretornará todas as sequências de correspondências (não apenas a primeira) empermitirá pesquisas de várias linhas. -
A instrução
forfaz um loop sobre todos os resultados e solicita que cada correspondência seja encontradas/\s//g && print "$_\n".s/\s//gremove todos os espaços (incluindo retornos de carro) eprint "$_\n"imprime o resultado final ($_sendo o valor atual no loop for)
Isso me dá os valores esperados (sem codificá-los no comando):
7530SRTRJTROIT
75304KSRTRSHT
753SLRTJSRT
753048SRYTSERY4654
753048499RYTSR
Atualizar : (para incluir o padrão de datas)
Por favor, use o seguinte comando agora:
cat file.txt | perl -e 'for$a(join("", <>)=~/\*([A-Z0-9\s]+?)\*\*\d{8}/g){$a=~s/\s+//g;print"$a\n"}'