Como extrair parte de uma string de um nome de arquivo e sed-lo para esse arquivo

0

Eu estou olhando para automatizar um processo em que uma parte do nome do arquivo é o que é usado para substituir um valor dentro do próprio arquivo.

Atualmente, uso um processo manual semelhante a este:

obtenha o orgname manualmente

$ grep -o orgname......... *2017-04* |uniq
...
uname=123456&**orgname=ABC5678**&userType=PERSISTENT&userLoginName=someusername&eventType=FAILED_LOGIN_ATTEMPT&timeOfOccurrence=2017-03-12%2016%3A49%3A36

Em seguida, substitua orgname por novo nome

$ sed -i 's/ABC1234/5678/g' '*'5678'*' ; sed -i 's/DEF2345/6789/g' '*'6789'*'; sed -i etc...

O resultado final ficaria assim:

uname=123456&orgname=**1234**&userType=PERSISTENT&userLoginName=someusername&eventType=FAILED_LOGIN_ATTEMPT&timeOfOccurrence=2017-03-12%2016%3A49%3A36

Os arquivos são nomeados assim:

rsa.collect.rsa-IB_L**1234**-2017-03-12.log.web1.decrypt

O que quer que seja depois de orgname = precisa mudar de ABC5678 para o que vier depois de Lxxxx, somente em arquivos com o mesmo xxxx em seu nome de arquivo.

Estou tendo dificuldade em entender como extrair esse número do nome do arquivo e usá-lo em sed . Existem centenas de arquivos (cada um com sua própria data) e 6 pares de números diferentes para trabalhar. Eu estou esperando para escrever um script bash que faz isso tudo de uma vez.

Eu estava tentando usar grep -P combinada com isso em algum tipo de variável e usando sed , mas talvez haja uma maneira melhor / mais fácil?

Deixe-me saber se há alguma pergunta adicional.

    
por Keith 08.05.2017 / 20:52

1 resposta

0

Quando o nome do arquivo estiver em uma variável, você poderá usar um shell expansão de parâmetro operador para extrair parte dele. Em seguida, substitua isso no comando sed . Abaixo eu uso o operador substring para obter 4 caracteres a partir da posição 20.

for file in rsa.collect.rsa-IB_L*.log.web1.decrypt; do
    orgname=${file:20:4}
    sed -i "s/orgname=[^&]*/orgname=$orgname/" "$file"
done
    
por 08.05.2017 / 21:58