我收到不同文件的通知文件。我想从这些通知文件中提取文件名,以便在另一个进程中使用。通知文件的前 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
以进行补偿。