从另一个文件名中提取文件名

从另一个文件名中提取文件名

我收到不同文件的通知文件。我想从这些通知文件中提取文件名,以便在另一个进程中使用。通知文件的前 4 个字符串将始终被忽略。因此文件名从第 5 个位置开始,可以以任何字符开头,并以.csv.文件名可以是任意长度。

一个例子:

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'

文件名分别为:

Filename = 'NBIRNans_DFT_TILT_EOF_FFP_20160619-10.csv'
Filename = 'Acc_Account_FFP_20160619-10.csv'
Filename = 'CRI_Position_FFP_20160619-10.csv'

我使用以下命令从通知文件名中提取文件名,但仅当文件名仅包含 3 个“_”时才有效:

Extract = echo $NotificationFile | cut -d "_" -f5-8
# $NotificationFile is the NotificationFile above
# Extract should be equal to Filename 

可用于任何文件名长度的通用命令是什么?

答案1

对于你想要的,你可以使用sed.我就是这样做的。

sed -ne 's/.*\(NB.*\)\_.*$/\FILENAME = \1 /p' 

答案2

如果所有文件名都以 结尾.csv,并且在任何地方都不包含另一个文件.csv名,请使用例如。sed之后删除所有内容:

Extract=$(echo $NotificationFile | sed 's/\.csv.*/.csv/')

将其与您之前的内容结合起来:

Extract=$(echo $NotificationFile | sed 's/\.csv_.*/.csv/' | cut -d "_" -f5-)

范围的N-意思是“到行尾”,即。如果_文件名中没有正好 3 个,则不会在第 8 个处停止。

答案3

使用字符串操作结构参数扩展

filename="${NotificationFile#????}"
filename="${filename%.csv*}.csv"

第一行设置filename为 的值,NotificationFile并去掉前四个字符。第二行删除从filename开始的所有内容.csv,并重新添加.csv以进行补偿。

相关内容