AWK命令剪切文件名

AWK命令剪切文件名
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。

它假设文件名不包含空格字符。

相关内容