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/gm
Este regexp procura por strings começando com uma estrela
\*
e feita de caracteres [A-Za-z0-9_] (o atalho é\w
para palavras) e espaços\s
, um possível~
(0 ou 1 vez) e, em seguida, 3 caracteres de palavras (por exemplo:RSS
ouSNA
), duas estrelas\*\*
seguido porTP
.Os parênteses são usados para capturar apenas o padrão entre eles.
/gm
são modificadores regexp, em queg
retornará todas as sequências de correspondências (não apenas a primeira) em
permitirá pesquisas de várias linhas. -
A instrução
for
faz um loop sobre todos os resultados e solicita que cada correspondência seja encontradas/\s//g && print "$_\n"
.s/\s//g
remove 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"}'