Bash 使用sed批量重命名文件。对's'命令RHS的引用无效

Bash 使用sed批量重命名文件。对's'命令RHS的引用无效,bash,sed,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_m

考虑到以下输入:

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
也就是说,我要执行两个更改:

  • 如果名称后缀存在,请删除它们,例如“\u e2”,以及
  • 当文件名(不带扩展名)没有以字母结尾(在我的示例中是字母a)时,将名称acq_mb更改为acq_mbme
  • 我在上尝试了以下正则表达式,它与我想要的完全匹配,并将信息存储在捕获组中,以便我可以正确重命名我的文件:

    (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'命令的引用无效\1 RHS

    我想了解为什么会发生这种情况,以及我如何修复它以使我的解决方案有效。(GNU sed 4.2.2)

    谢谢你花时间帮助我

    编辑

    最终解决方案(已接受答案的分数):


    以下是您要查找的sed命令:

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

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


    更改
    acq\u mbme\2
    acq\u mbme\2.
    ,否则您将获得例如
    …magnificate02json
    以下是您正在查找的sed命令:

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

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


    更改
    acq\u mbme\2
    acq\u mbme\2.
    或者您得到例如
    …magnity02json

    您需要转义分组括号(
    \(…\)
    )或者要使用
    sed
    -r
    扩展正则表达式标记,您还可以考虑使用
    rename
    命令,而不是使用sed编写自己的循环。您需要转义分组括号(
    \(…\)
    )或者要使用
    sed
    -r
    扩展正则表达式标记,您还可以考虑使用
    重命名
    命令,而不是使用sed编写自己的循环。