Regex 如何将文件名解析为组件
我收集了一组vhs传输的电视剧集,所有这些剧集的标题都是按照“Show Name SXEYY Spice Title.mp4”的格式命名的,我想在其中添加iTunes mp4标签。我有一种从命令行进行标记的方法,但我想改进我的shell脚本功能,并编写一些可以自动完成的东西 我想bash脚本可以帮我做到这一点。理想情况下,一个正确编写的正则表达式将查看文件名并返回节目、季节、插曲和标题,并允许我将这些结果传递给bash脚本中的标记工具。正确编写的正则表达式将返回BASH_REMATCH[1]…[4]和这四条数据 这就是我被卡住的地方——我似乎无法让我的正则表达式序列正常工作 我对语法的理解表明,以下表达式:Regex 如何将文件名解析为组件,regex,macos,bash,Regex,Macos,Bash,我收集了一组vhs传输的电视剧集,所有这些剧集的标题都是按照“Show Name SXEYY Spice Title.mp4”的格式命名的,我想在其中添加iTunes mp4标签。我有一种从命令行进行标记的方法,但我想改进我的shell脚本功能,并编写一些可以自动完成的东西 我想bash脚本可以帮我做到这一点。理想情况下,一个正确编写的正则表达式将查看文件名并返回节目、季节、插曲和标题,并允许我将这些结果传递给bash脚本中的标记工具。正确编写的正则表达式将返回BASH_REMATCH[1]…[
Regex for Show Name: ^(?:(?! S[0-9][0-9]).)*
Regex for Season Number: (?<=S)(.*)(?=E)
Regex for Episode Number: (?<=S[0-9][0-9]E)..
Regex for Episode Title: (?<=S[0-9][0-9]E[0-9][0-9] )(.*)(?=.(mp4))
显示名称的正则表达式:^(?(?!S[0-9][0-9]))*
季号的正则表达式:(?您正在尝试使用Perl样式的正则表达式(特别是零宽度查找断言),而bash不理解它。请尝试以下操作:
regex="(.*) S([0-9]{2})E([0-9]{2}) (.*)\.mp4"
for filename in "Cop Rock S01E03 Happy Mudder's Day.mp4" ; do
if [[ "$filename" =~ $regex ]]; then
echo "Show: ${BASH_REMATCH[1]}"
echo "Season: ${BASH_REMATCH[2]}"
echo "Episode: ${BASH_REMATCH[3]}"
echo "Title: ${BASH_REMATCH[4]}"
fi
done
我知道上次关于这个问题的活动已经过去了1.5年,但我也在寻找同样的答案。我对答案进行了一些调整,使之更为通用(允许所有小写文件名、点代替空格、不同的扩展名和多个文件名),因此我想与您分享我的更新:
#!/bin/bash
regex="(.*)[ .][sS]([0-9]{2})[eE]([0-9]{2})[ .](.*)\.(mp4|mkv)"
for filename in ${*}
do
if [[ "${filename}" =~ ${regex} ]]; then
echo "Show: ${BASH_REMATCH[1]}"
echo "Season: ${BASH_REMATCH[2]}"
echo "Episode: ${BASH_REMATCH[3]}"
echo "Title: ${BASH_REMATCH[4]}"
fi
done
如果您将其复制到shell文件并使其可执行,则可以更通用地使用它。
[0-9]
将更简洁。是的。不确定我为什么更改为[[:digit:]
当我写这个正则表达式时。它适用于其他地区,但这不是一个真正的问题。是的,这就解决了它。谢谢!我们村的孩子会为你歌唱。
#!/bin/bash
regex="(.*)[ .][sS]([0-9]{2})[eE]([0-9]{2})[ .](.*)\.(mp4|mkv)"
for filename in ${*}
do
if [[ "${filename}" =~ ${regex} ]]; then
echo "Show: ${BASH_REMATCH[1]}"
echo "Season: ${BASH_REMATCH[2]}"
echo "Episode: ${BASH_REMATCH[3]}"
echo "Title: ${BASH_REMATCH[4]}"
fi
done