ファイル名を切り取る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]\)_'

-(ここでは2番目以降から一番右に出てくる部分を抽出します。_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

-valueでdash()で区切られた最初の2つと最後の3つの文字列を削除したいようです$fileName。これはパラメータ置換によって最も効率的に行われます(「効率的」=外部プログラムを使用せずにシェルのみを使用)。

$ 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

最も簡単な方法は、おそらくカットを使用することです。

printf '%s\n' "$fileName" | cut -d- -f3-5

これは、区切り文字を「-」に設定し、フィールド3-5を抽出します。

ファイル名に空白文字が含まれていないとします。

関連情報