我有很多文件名都有这种格式:
118-edorf.sum.fil
118-edorf.sum.fil_1
118-edorf.sum.fil_11
我想删除118-edorf.sum。从文件名中获取扩展名,fil,fil_1和fil_11并将其重命名为asc,asc_1和asc_11。
到目前为止,我只能删除118-edorf.sum。使用
sed 's/.*\.//'
结果将是
fil
fil_1
fil_11
那么,如何将其重命名为
asc
asc_1
asc_11
答案 0 :(得分:0)
在您的解决方案中只添加额外的替换
sed 's/^.*\.//; s/fil/asc/'
使用该条件重命名目录中的所有文件
rename 's/^.*\.//; s/fil/asc/' *
注意:此重命名命令未经测试
答案 1 :(得分:0)
你可以尝试这个zsh foreach循环。对于许多文件,Foreach可能有点慢。您还可以删除echo语句,以减少噪声较大的输出。
foreach C (`ls 118-edorf.sum.fil*`)
f2=`echo $C|cut -d "." -f 3|cut -s -d "_" -f 2`
if [ "${f2}" -eq "" ]; then
echo "no underscore"
mv $C asc
elif
echo "_${f2}"
mv $C "asc_${f2}"
end
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/.*\.([^_]*(.*))/mv \1 asc\2/e' file
使用已评估的替换命令。替换删除了最后一个.
的所有内容,并将此后的所有内容保留为第一个反向引用。在该反向引用中第一个_
之后的所有内容也将保留为第二个反向引用。替换命令的RHS使用LHS中的部分形成mv
命令。
如果您的sed没有e
命令/标志,请使用:
sed 's/.*\.\([^_]*\(.*\)\)/mv \1 asc\2/' file | shell
使用起来可能更安全:
sed -r 's/.*\.(fil(.*))/mv \1 asc\2/e' file