ファイルパスの途中で6桁の数字を取得する方法

ファイルパスの途中で6桁の数字を取得する方法

次のファイルパス名があります。

/dbfs/mnt/dlg2stage/foldername/backupname/201906_load_1_20210623-151602.tar.tgz

201906 6桁の数字だけを求めて印刷しようとしています。試しましたが失敗sedしましたawk

答え1

これがシステムの実際のファイルであると仮定すると、_シェルループを使用して、一致するディレクトリ内の各ファイルの最初のファイル名の前の部分を簡単に抽出できます。*_*.tar.tgz/dbfs/mnt/dlg2stage/foldername/backupname

for pathname in /dbfs/mnt/dlg2stage/foldername/backupname/*_*.tar.tgz; do
    name=$( basename "$pathname" )
    printf '%s\n' "${name%%_*}"
done

このbasenameユーティリティは、パス名のファイル名部分を提供します。示した例では、文字列を201906_load_1_20210623-151602.tar.tgz変数に割り当てますname。を使用name=${pathname##*/}して同じことを行うこともできます(このパラメータ拡張は文字列の最初の部分を$pathname最後の部分まで削除します/)。

パラメータ拡張の${name%%_*}ため、_*最も長い末尾の部分文字列一致はvalueから削除されます$name。表示されている例では、最初の_文字とその右側のすべての文字を削除し、部分文字列を残してを201906使用して印刷できますprintf

答え2

そしてzsh

file=/dbfs/mnt/dlg2stage/foldername/backupname/201906_load_1_20210623-151602.tar.tgz
set -o extendedglob # for (#c6)

first_6_digits_of_file_tail=${(M)${file:t}[0-9](#c6)}

${file:t}必要な場所${(M)var#pattern}一致するパターンの先頭を返すファイル名(デフォルト名)。$varM

POSIXlyでは、次のものを使用できます。

first_6_digits_of_file_tail=$(
  LC_ALL=C expr "/$file" : '.*/\([0-9]\{6\}\)[^/]*/*$'
)

LC_ALL=Cユーザーのロケールを無視し、すべてのバイトを文字として扱います(/および0123456789数字を含むほとんどのシステムではASCIIのビット128に従います)。したがって、バイトは.一致し、0123456789のみが含まれます。数値コードポイントに基づく範囲ではなく、zshは有効な文字の一部を形成しない各バイトを文字と同じように扱います。[^/][0-9]zsh

プレフィックスを使用すると、演算子で始まる、または演算子のように見える値/の問題を回避し、文字列に正規表現で予想される値が少なくとも1つ含まれることを保証します。$file-expr/

/orのデフォルト名を持つorを使用してzshの解決策と同じ動作を得ることを除いて、最後の後ろにsを許可しません。/XXXXXXbasename$file:t/foo/bar//foo/bar////bar

一致するものがなく、6桁のシーケンスが0の数値を示す場合(図を参照/path/to/000000_whatever)、偽/失敗の終了ステータスを返します。

答え3

201906私はあなたが与えられたパス文字列を印刷したいと思います。この例では、6桁の数字は次のとおりです。スラッシュが前にある最初の6桁の数字

コマンドを読みやすくするために、パスを変数に入れました。

% path_str='/dbfs/mnt/dlg2stage/foldername/backupname/201906_load_1_20210623-151602.tar.tgz'

% echo $path_str | sed 's/.*\/\([0-9]\{6\}\).*/\1/'
201906

これが私が試合を設定して交換する方法です。sed:

  • \/[0-9]\{6\}:スラッシュと6桁の数字と一致
  • \/\([0-9]\{6\}\):同じですが、今キャプチャグループまたはサブ式(スラッシュはキャプチャグループにはありません)
  • .*\/\([0-9]\{6\}\).*:前と後のすべてのものと一致するので...ワイヤー
  • \1:参照を使用して行全体と一致します。最初行全体を最初の6桁の数字にのみ置き換える(ユニークな)キャプチャグループ

関連情報