写shell脚本的时候,经常会遇到字符串切割的情况。
除了常用的grep -o, sed, awk, cut之外,还有一种依靠变量本身切割的方式,特别适合掐头去尾的场景。
例如:
有个文件名为“abc-dd.123.log“
file="abc-dd.123.log"
- 如果想去掉 ".log",只保留“abc-dd.123”,我们可以这样:
echo ${file%.*}
- 如果只保留“abc-dd”,可以这样:
echo ${file%%.*}
- 如果只保留“log”, 可以这样:
echo ${file##*.}
- 如果只保留“dd.123.log”,可以这样:
echo ${file#*-}
使用公式:
${<变量名>[%|%%|#|##]<正则表达式>}
其中,重点是“正则表达式”,匹配的是要删掉的部分
% | 从后往前最短匹配 |
%% | 从后往前最长匹配 |
# | 从前往后最短匹配 |
## | 从前往后最长匹配 |
所以,上面的几个例子,可以用文字描述为
${file%.*} 从后往前,删掉第一个"."以及它之后的字符
匹配结果: abc-dd.123.log
${file%%.*} 从后往前,删掉最后一个“.”以及它之后的字符
匹配结果: abc-dd.123.log
${file##*.} 从前往后,删掉最后一个"."以及它之前的字符
匹配结果: abc-dd.123.log
${file#*-} 从前往后,删掉第一个"-"以及它之前的字符
匹配结果: abc-dd.123.log