fileName=20201211-v1-ABC144_newrecords_2020-12-10_12-51-32-000_2444_511
fName1=$(echo $fileName | awk -F"-" '{ print $3 }')
将文件名从 $3 剪切到截止日期值
我需要这样的文件名:
ABC144_newrecords_2020-12-10_12
答案1
要提取遵循模式的部分字符串,您可以使用expr
:
expr " $fileName" : '[^-]*-[^-]*-\(.*_[0-9]\{4\}-[01][0-9]-[0-3][0-9]\)_'
-
(这里提取第二个之后直到最右边出现的部分_YYYY-MM-DD_
(_
不包括尾随))
或者与zsh
:
set -o extendedglob
[[ $fileName = (#b)[^-]#-[^-]#-(*_[0-9](#c4)-[01][0-9]-[0-3][0-9])_* ]] &&
print -r - $match[1]
或者:
set -o rematchpcre
[[ $fileName =~ '^.*?-.*?-(.*_\d{4}-[01]\d-[0-3]\d)_' ]] &&
print -r - $match[1]
或者与ksh93
:
printf '%s\n' "${fileName/#*([^-])-*([^-])-@(*_{4}(\d)-[01][0-9]-[0-3][0-9])_*/\3}"
或者与bash
:
[[ $fileName =~ ^[^-]*-[^-]*-(.*_[0-9]{4}-[01][0-9]-[0-3][0-9])_ ]] &&
printf '%s\n' "${BASH_REMATCH[1]}"
答案2
您似乎想要-
从值中删除由破折号 ()分隔的前两个和后三个字符串$fileName
。通过参数替换可以最有效地完成此操作(“高效”= 不使用任何外部程序,仅使用 shell)。
$ fileName=20201211-v1-ABC144_newrecords_2020-12-10_12-51-32-000_2444_511
$ fileName=${fileName#*-*-}
$ echo "$fileName"
ABC144_newrecords_2020-12-10_12-51-32-000_2444_511
$ fileName=${fileName%-*-*-*}
$ echo "$fileName"
ABC144_newrecords_2020-12-10_12
替换${fileName#*-*-}
将是该值,但删除了与开头的$fileName
模式匹配的位。*-*-
以类似的方式,${fileName%-*-*-*}
将是,但删除末尾$fileName
匹配的位。-*-*-*
答案3
最简单的方法可能是使用 cut:
printf '%s\n' "$fileName" | cut -d- -f3-5
这只是将分隔符设置为“-”并提取字段 3-5。
它假设文件名不包含空格字符。