使用sed批量重命名文件。对`s`命令RHS

时间:2016-10-20 15:30:57

标签: bash sed

给出以下输入:

task-rest_acq-mb01_bold_magnitude01a.json
task-stroop_acq-mb01_bold_magnitude01a.json
task-rest_acq-mb01_bold_magnitude01.json
task-stroop_acq-mb01_bold_magnitude01.json
task-rest_acq-mb02_bold_magnitude02_e2.json
task-stroop_acq-mb02_bold_magnitude02_e2.json
task-rest_acq-mb03_bold_magnitude03_e3.json
task-stroop_acq-mb03_bold_magnitude03_e3.json

我想要以下输出:

task-rest_acq-mb01_bold_magnitude01a.json # no change. 
task-stroop_acq-mb01_bold_magnitude01a.json # no change
task-rest_acq-mbme01_bold_magnitude01.json # changed acq-mb to acq-mbme
task-stroop_acq-mbme01_bold_magnitude01.json # same as above
task-rest_acq-mbme02_bold_magnitude02.json # same and removed _e2
task-stroop_acq-mbme02_bold_magnitude02.json # same as above
task-rest_acq-mbme03_bold_magnitude03.json # same and removed _e3
task-stroop_acq-mbme03_bold_magnitude03.json # same as above

也就是说,我想进行两项修改:

  1. 删除名称后缀,例如" _e2"
  2. 将名称​​ acq_mb 更改为 acq_mbme ,此时文件名(不带扩展名)不以字母结尾(在我的示例中为字母a)。< / LI>

    我在regex101上尝试了以下正则表达式,它与我想要的完全匹配,并将信息存储在捕获组中,以便我可以正确地重命名我的文件:

    (acq-mb)(.*_bold_magnitude\d*)([\.|_]+e\d)*\.
    

    因此,我尝试使用以下脚本进行批量重命名:

    for i in *; do       ##        /1              /2                 /3
      mv "$i" "`echo $i | sed "s/(acq-mb)(.*_bold_magnitude\d*)([\.|_]+e\d)*\./acq_mbme\2/"`";
    done
    

    我只想保留捕获组2,所以我不会在替换字符串上使用其他捕获组。 问题是我在尝试我的脚本时遇到以下错误:

      

    sed:-e表达式#1,字符51:s&#39;上的无效引用\ 1命令&#39; S   RHS

    我想了解为什么会发生这种情况,以及如何解决这个问题以便我的解决方案能够正常运行。 (GNU sed 4.2.2)

    感谢您抽出宝贵时间帮助我。

    修改

    最终解决方案(归功于接受的答案):

    for i in *; do
    mv "$i" "`echo $i | sed -r "s/(acq-mb)(.*_bold_magnitude[0-9]*)([\.|_]+e[0-9])*\./acq_mbme\2./"`";
    done
    

1 个答案:

答案 0 :(得分:0)

这是您正在寻找的sed命令:

sed -r 's/(acq-mb)(.*_bold_magnitude[0-9]*)([\.|_]+e[0-9])*\./acq_mbme\2./'

-r,以便使用()代替\(\)

sed不知道\d,请改用[0-9]

更改acq_mbme\2 acq_mbme\2.,否则您会获得...magnitude02json

相关问题