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
也就是说,我要执行两个更改:
(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编写自己的循环。