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