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を抽出します。
ファイル名に空白文字が含まれていないとします。