指定した区切り文字でファイル名を分割する方法

指定した区切り文字でファイル名を分割する方法

データの取得を試みているファイル名が約 200 個あります。形式は、filename(120516.1108).mp3 のようなものです。「(」の前の部分と「.」の前の部分を取得しようとしています。すべてのファイルがこの形式であるわけではないので、追加の課題があります。

出力は次のようになります: "filename" "120516"

可能であれば、この操作を bash で実行したいと考えています。私はまだ学習中で、bash の経験はほとんどありません。コードとともに説明があれば大歓迎です。

答え1

「bash では」次のようになります:

re='^(.*)\(([0-9]+)\.[0-9]+\).*$'

それから

for f in *.mp3; do 
  [[ $f =~ $re ]] && printf '"%s" "%s"\n' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
done

答え2

私の理解が正しければ、そのコマンドは動作するはずです(ファイル名に「(」と「.」がない場合)

data=$(echo $file | cut -d"." -f1 | tr -d "(")

これらを 2 つの変数に分割します。

filename=$(echo $file | cut -d"(" -f1)
number=$(echo $file | cut -d"(" -f2 | cut -d"." -f1)

答え3

使用パラメータ拡張切り捨て。

case "$filename" in
  *\(*.*\)*)
    before_first_parenthesis=${filename%%\(*}
    after_first_parenthesis=${filename#*\(}
    before_dot=${after_first_parenthesis%%.*}
    echo "$before_first_parenthesis" "$before_dot"
  *) echo "does not match the format";;
esac

関連情報