Para o que você deseja, você pode usar sed . É assim que eu faria.
sed -ne 's/.*\(NB.*\)\_.*$/\FILENAME = /p'
Eu recebo arquivos de notificação para arquivos diferentes. Eu quero extrair o nome do arquivo desses arquivos de notificação que eu usaria em outro processo. As primeiras 4 strings do arquivo de notificação serão sempre ignoradas. Portanto, o nome do arquivo começa na posição 5, pode começar com qualquer caractere e termina no .csv . O nome do arquivo pode ser de qualquer tamanho.
Um exemplo:
NotificationFile = 'NFT_PPF_STANDARD_1720156B_NBIRNans_DFT_TILT_EOF_FFP_20160619-10.csv_16062000352520'
NotificationFile = 'NFT_PPF_IMPULSE_172555A_Acc_Account_FFP_20160619-10.csv_16062000352520'
NotificationFile = 'NFT_PPF_IMPULSE_172555A_CRI_Position_FFP_20160619-10.csv_16062000352520'
Os nomes dos arquivos, respectivamente:
Filename = 'NBIRNans_DFT_TILT_EOF_FFP_20160619-10.csv'
Filename = 'Acc_Account_FFP_20160619-10.csv'
Filename = 'CRI_Position_FFP_20160619-10.csv'
Eu uso o seguinte comando para extrair o nome do arquivo do nome do arquivo de notificação, mas ele só funciona se o nome do arquivo contiver apenas 3 '_s:
Extract = echo $NotificationFile | cut -d "_" -f5-8
# $NotificationFile is the NotificationFile above
# Extract should be equal to Filename
O que é um comando geral que eu posso usar para qualquer comprimento de nome de arquivo?
Para o que você deseja, você pode usar sed . É assim que eu faria.
sed -ne 's/.*\(NB.*\)\_.*$/\FILENAME = /p'
Se todos os nomes de arquivo terminarem com .csv e não contiverem outro .csv em qualquer lugar, use por exemplo. sed para remover tudo depois disso:
Extract=$(echo $NotificationFile | sed 's/\.csv.*/.csv/')
Combinando isso com o que você tinha antes:
Extract=$(echo $NotificationFile | sed 's/\.csv_.*/.csv/' | cut -d "_" -f5-)
O intervalo N- significa "até o final da linha", ou seja. não parando no dia 8 se não houvesse exatamente 3 _ s no nome do arquivo.
Use as construções de manipulação de string da expansão do parâmetro .
filename="${NotificationFile#????}"
filename="${filename%.csv*}.csv"
A primeira linha define filename para o valor de NotificationFile com os primeiros quatro caracteres removidos. A segunda linha remove tudo de filename começando com .csv e adiciona novamente .csv para compensar.
Tags shell-script filenames string