给出以下输入:
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
也就是说,我想进行两项修改:
我在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'上的无效引用\ 1命令' 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
答案 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