Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何将文件名解析为组件_Regex_Macos_Bash - Fatal编程技术网

Regex 如何将文件名解析为组件

Regex 如何将文件名解析为组件,regex,macos,bash,Regex,Macos,Bash,我收集了一组vhs传输的电视剧集,所有这些剧集的标题都是按照“Show Name SXEYY Spice Title.mp4”的格式命名的,我想在其中添加iTunes mp4标签。我有一种从命令行进行标记的方法,但我想改进我的shell脚本功能,并编写一些可以自动完成的东西 我想bash脚本可以帮我做到这一点。理想情况下,一个正确编写的正则表达式将查看文件名并返回节目、季节、插曲和标题,并允许我将这些结果传递给bash脚本中的标记工具。正确编写的正则表达式将返回BASH_REMATCH[1]…[

我收集了一组vhs传输的电视剧集,所有这些剧集的标题都是按照“Show Name SXEYY Spice Title.mp4”的格式命名的,我想在其中添加iTunes mp4标签。我有一种从命令行进行标记的方法,但我想改进我的shell脚本功能,并编写一些可以自动完成的东西

我想bash脚本可以帮我做到这一点。理想情况下,一个正确编写的正则表达式将查看文件名并返回节目、季节、插曲和标题,并允许我将这些结果传递给bash脚本中的标记工具。正确编写的正则表达式将返回BASH_REMATCH[1]…[4]和这四条数据

这就是我被卡住的地方——我似乎无法让我的正则表达式序列正常工作

我对语法的理解表明,以下表达式:

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