我有大约 200 个文件名,我正在尝试从中提取数据。格式类似于: filename(120516.1108).mp3 我试图拉出“(”之前的部分以及“.”之前的部分。并非所有文件都具有这种格式,因此还有一个额外的挑战。
输出应该是:“文件名”“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