データの取得を試みているファイル名が約 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