Shell 如何从文件名中删除年和月

Shell 如何从文件名中删除年和月,shell,unix,Shell,Unix,如何从文件名中删除年和月,如ABC\u PQRS\u XYZ\u 2016\u 09 取两个变量的值,如: ABC_PQRS_XYZ_2016_09 year=2016 Month = 09 或 在Bash中 filename='ABC_PQRS_XYZ_2016_09' month="${filename: -2}" year="${filename: -7:4}" printf "year: %s\nmonth: %s\n" "$year" "$month" 输出 便携式版本 yea

如何从文件名中删除年和月,如
ABC\u PQRS\u XYZ\u 2016\u 09

取两个变量的值,如:

ABC_PQRS_XYZ_2016_09

year=2016
Month = 09


在Bash中

filename='ABC_PQRS_XYZ_2016_09'
month="${filename: -2}"
year="${filename: -7:4}"

printf "year: %s\nmonth: %s\n" "$year" "$month"
输出

便携式版本

year="${filename%*_*}"
year="${year##*_}"
month="${filename##*_}"

printf "year: %s\nmonth: %s\n" "$year" "$month"
p.S.

在对另一个答案的评论中,您提到您实际上有一个扩展名为
.txt
的文件名。可以使用
basename
命令切断扩展:

filename=$(basename "$filename")

这可以通过合适的内部字段分隔符(IFS)和
设置便携式完成:

$ saved_IFS=$IFS
$ filename='ABC_PQRS_XYZ_2016_09.txt'
$ IFS=_.
$ set -- $filename
$ echo $1
ABC
$ echo $2
PQRS
$ echo $3
XYZ
$ echo $4
2016
$ echo $5
09
$ echo $6
txt
$ IFS=$saved_IFS

请注意,这是纯shell代码。没有bashisms,也没有昂贵的分叉到awk、cut、basename或其他。

谢谢你的回复,但我的文件有扩展名。txtmount=$(echo ABC_PQRS_XYZ_2016_09.txt | awk-F{print$(NF)}),它给出了09.txt
year="${filename%*_*}"
year="${year##*_}"
month="${filename##*_}"

printf "year: %s\nmonth: %s\n" "$year" "$month"
filename=$(basename "$filename")
$ saved_IFS=$IFS
$ filename='ABC_PQRS_XYZ_2016_09.txt'
$ IFS=_.
$ set -- $filename
$ echo $1
ABC
$ echo $2
PQRS
$ echo $3
XYZ
$ echo $4
2016
$ echo $5
09
$ echo $6
txt
$ IFS=$saved_IFS