使用 bash 脚本删除文件名中不需要的信息



我需要在 bash 脚本中删除名称前后的所有内容,以下是示例

test_3123_123_testone-2.cpp
abc_3123_12312_a.cpp
johnchase_4123123123_123123123_johnc-1.cpp

我需要他们简单地变成

testone.cpp
a.cpp
johnc.cpp

但是在使用正则表达式时遇到问题并尝试正确进行此设置,任何建议都会很棒!

文本

.cpp之前的文本,但如果它们后面存在任何破折号(-2),则忽略它们。

正是这样做的。从最后写出来。

  • "在.cpp之前"->所以.cpp必须是最后一个
  • "忽略任何破折号" - 所以有一个破折号(-2)
    • "如果他们存在于它后面" - 破折号是可选的
  • "文本" - 所以匹配文本。

var=test_3123_123_testone-2.cpp
[[ "$var" =~ ([^_-]*)(-[0-9]+)?.cpp$ ]]
echo ${BASH_REMATCH[1]}.cpp

如果您的文件名位于名为file的变量中,则:echo ${${file##*_}/-[0-9]*[.]/.}

从内到外分解一下:

  • ${file$$*_}删除从字符串开头到最后一个_的所有内容
  • ${file/-[0-9]*[.]/.}将"破折号点"替换为一个点

这不是防弹的,但它涵盖了给定的情况。

$ for file in test_3123_123_testone-2.cpp abc_3123_12312_a.cpp johnchase_4123123123_123123123_johnc-1.cpp
do
echo ${${file##*_}/-[0-9]*[.]/.}
done
testone.cpp
a.cpp
johnc.cpp

相关内容

最新更新