我需要在 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