我需要删除文件名中介于-和_之间的序列号(也应删除下划线)。
原始文件名:20190815-12345_table_file.rar
预期:20190815-table_file.rar
我的bash代码:
for f in ./*.rar;
do fn=`echo $f|sed 's/^-[0-9].*_$/-/g'`;
mv "$f" "$fn";
done;
我尝试了类似的操作,因为我知道我的数字以“-”(所以^)开头是数字([0-9]。*),以“ _”(所以是$)结尾,我想用“-”代替数字。
但是使用这种方法无效。
答案 0 :(得分:2)
您用于sed的正则表达式与您想要的方式不匹配:开始和结束定界符是行的开始和结束的锚点。另外,您希望[0-9]*
的任何数量的数字都没有点。
尝试以下方法:
for f in ./*.rar; do
fn="$( sed 's/-[0-9]*_/-/g' <<<"$f" )"
mv "$f" "$fn"
done
在bash中,您可以使用参数扩展来进行替换而无需使用sed
;我忘记了确切的语法,因此暂时将其省略,以后再添加。检查man bash
以获得详细信息。
答案 1 :(得分:1)
所有Bash解决方案是:
for f in ./*.rar; do
mv "$f" "${f/-*([0-9])_/-}"
done
您必须启用extglob
的{{1}} shell选项,才能使shopt -s extglob
模式起作用。
有关参数扩展如何工作的更多信息,请参见Bash Reference Manual或this answer。