字符串操作之 - 截取匹配
2018-02-09 本文已影响1人
CodingCode
截取字符串的前匹配,或者后匹配子串。
概说
基本语法
${str#<substr>} : 从左边开始,最小匹配,也就是匹配到第一个就停止
${str##<substr>} : 从左边开始,最大匹配,也就是匹配到最后才停止
${str%<substr>} : 从右边开始,最小匹配,也就是匹配到第一个就停止
${str%%<substr>} : 从右边开始,最大匹配,也就是匹配到最后才停止
从str中删除满足条件substr的字符串,返回剩下部分。
- #和%的区别是:删除字符的方向不一样,前者从左开始,后者从右开始。
- #和##,以及%和%%的区别是:前者是最小匹配,后者是最大匹配。
例子1:基本用法
假定字符串值:
var="123ABC456DEF789"
- 提取最前面的数字字符串:
echo ${var%%[^0-9]*} # 返回:123
- %%表示从后面开始,最大匹配 "[^0-9]*"这个表达式,最终匹配到的是"ABC456DEF789",所以最后剩下"123"。
- 提取最后面的数字字符串:echo ${var##*[^0-9]}
echo ${var##*[^0-9]} # 返回:789
- ##表示从前面开始,最大匹配 "*[^0-9]"这个表达式,最终匹配到的是"123ABC456DEF",所以最后剩下"789"。
- 删除最前面的数字字符串:
我们希望返回"BC456DEF789"。
echo ${var#*[^0-9]} # 返回:BC456DEF789
- OOO,怎么把"A"也删除了呢???
- 我们分析"*[^0-9]",从左边开始直到非数字字符,"A"是这个非数字字符,所以"A"也被删掉了。
那该怎么办呢,我也没有找到办法,这个语法该怎么写呢,希望大咖提示。
这有另一种场景可以使用,就是使用特殊字符作为分隔符的。
例子1:剔除第一个段
var="field1-field2-field3-field4"
echo ${var#*-} # 返回:field2-field3-field4
例子2:剔除最后一个段
var="field1-field2-field3-field4"
echo ${var%-*} # 返回:field1-field2-field3
而在我们前面例子中,如果要删除前导或者后缀数字字符,可以使用其他工具,例如sed
$ echo $var | sed -e "s/^[0-9]*//" # 返回:ABC456DEF789
$ echo $var | sed -e "s/[0-9]*$//" # 返回:123ABC456DEF
- 删除最后面的数字字符串:
请参考3. 删除最前面的数字字符串:中描述的问题和办法。
例子2:路径中提取文件名和目录
var="/home/user/app/example.txt"
echo ${var%/*} # 返回路径名:/home/user/app
echo ${var##*/} # 返回文件名:example.txt
例子3:从文件名中提取扩展名
var="example.txt"
echo ${var##*.} # 返回:txt