AWK,SED,REGEX重命名文件

前端之家收集整理的这篇文章主要介绍了AWK,SED,REGEX重命名文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我只是学习使用REGEX,AWK和SED.我目前有一组我想要重命名文件 – 它们都位于一个目录中.

命名模式是一致的,但我想重新安排文件名,这里是格式:

01._HORRIBLE_HISTORIES_S2.mp4
02._HORRIBLE_HISTORIES_S2.mp4

我想将它们重命名为HORRIBLE_HISTORIES_s01e01.mp4 – 其中e01是从第一列收集的.我知道我想要从第一列中获取“01”,将其填入变量中,然后将其粘贴到每个文件名中的S2之后,同时我想将其从文件名的开头与“.”一起删除. _“,另外我想将”S2“改为”s02“.

如果有人会这么善良,你能帮助我用awk / sed写一些东西并解释一下我可以从中学到的程序吗?

解决方法

for f in *.mp4; do 
  echo mv "$f" \
    "$(awk -F '[._]' '{ si = sprintf("%02s",substr($5,2)); 
                          print $3 "_" $4 "_s" si "e" $1 "." $6 }' <<<"$f")"
done

>循环所有* .mp4文件.
>将每个重命名为awk命令的结果,通过命令替换($(…))提供.
> awk命令将输入​​文件名拆分为令牌.或“_”(使第一个令牌可用作$1,第二个令牌为$2,……).
>首先,将“_S {number}”中的数字左边填充为2位数,并为0(即,如果数字不具有2位数,则仅预设0)并存储在变量si(季节索引)中;如果总是在前面加0,那么awk“程序”可以简化为:{print $3“_”$4“_s0”substr($5,2)“e”$1“.” $6}
>然后重新排列结果以及剩余的标记以形成所需的文件名.

注意mv之前的echo以允许您安全地预览生成的命令 – 将其删除以执行实际重命名.

替代方案:使用正则表达式的纯bash解决方案:

for f in *.mp4; do 
  [[ $f =~ ^([0-9]+)\._([^.]+)_S([^.]+)\.(.+)$]]
  echo mv "$f" \
"${BASH_REMATCH[2]}_s0${BASH_REMATCH[3]}e${BASH_REMATCH[1]}.${BASH_REMATCH[4]}"
done

>使用bash的正则表达式匹配运算符=〜,使用捕获组((…)中的子字符串)匹配每个文件名并提取感兴趣的子字符串.
>匹配结果存储在特殊数组变量$BASH_REMATCH中,元素0包含整个匹配,1包含与第一个捕获组匹配的内容,2包含第二个捕获组,依此类推.
>然后,mv命令的target参数按所需顺序组装捕获组匹配项;请注意,在这种情况下,为简单起见,我使s {number}的无填充无条件 – 简单地预先设置了0.

如上所述,您需要在mv之前删除echo以执行实际重命名.

猜你在找的Linux相关文章