这里有一种更动态的方法,只使用
bash
而不需要外部工具即可读取所有/所需标签并将其存储到同名变量中以供进一步使用。这种方法更快且能够获得您需要的所有标签,无需额外的成本/代码。
另一个好处是它是可移植的(
<<<
需要
bash 2.05
,
${foo,,}
需要
bash 4
,但可以轻松地删除,其余部分符合POSIX)。例如,在OS X上,
grep -P
虽然非常方便,但已不再可用,因此如果可移植性是一个问题,则不太适合用于脚本。
#!/bin/bash
while IFS=' \t:' read -r key value; do
case ${key} in
TALB|TCON|TFOO) ;;
*) continue ;;
esac
read -r "${key,,}" <<< "${value}"
done <<__DATA__
TALB: Album Name
TCON: example.com (255)
TFOO: tfoo
TBAR: tbar
__DATA__
echo "TALB: $talb"
echo "TCON: ${tcon% (255)}"
echo "TFOO: $tfoo"
echo "TBAR: $tbar"
.
$ ./t.sh
TALB: Album Name
TCON: example.com
TFOO: tfoo
TBAR:
${foo,,}
是bash 4
中的概念,将$foo
转换为小写,以避免使用大写变量名称,但如果您没有bash 4
,则可以直接放弃它并使用大写名称,或者使用tr
将它们转换为小写。
while read line
惯用语在这里有很好的解释。
不要像我使用heredoc来模拟id3v2
的输出,而应使用进程替换将id3v2
的输出“管道”到循环中,例如:
while [...]
[...]
done < <(id3v2 -R Idhayam.mp3)
grep
来完成那个任务。就像你所做的那样,你必须使用 sed 或其他过滤器来剥离行中的部分内容。 - Diego Sevilla