美文网首页Shell语言用例
字符串操作之 - 截取匹配

字符串操作之 - 截取匹配

作者: CodingCode | 来源:发表于2018-02-09 15:43 被阅读1次

截取字符串的前匹配,或者后匹配子串。

概说

基本语法

${str#<substr>}         : 从左边开始,最小匹配,也就是匹配到第一个就停止
${str##<substr>}        : 从左边开始,最大匹配,也就是匹配到最后才停止
${str%<substr>}         : 从右边开始,最小匹配,也就是匹配到第一个就停止
${str%%<substr>}        : 从右边开始,最大匹配,也就是匹配到最后才停止

从str中删除满足条件substr的字符串,返回剩下部分。

  • #和%的区别是:删除字符的方向不一样,前者从左开始,后者从右开始。
  • #和##,以及%和%%的区别是:前者是最小匹配,后者是最大匹配。

例子1:基本用法

假定字符串值:

var="123ABC456DEF789"
  1. 提取最前面的数字字符串:
echo ${var%%[^0-9]*}    # 返回:123
  • %%表示从后面开始,最大匹配 "[^0-9]*"这个表达式,最终匹配到的是"ABC456DEF789",所以最后剩下"123"。
  1. 提取最后面的数字字符串:echo ${var##*[^0-9]}
echo ${var##*[^0-9]}    # 返回:789
  • ##表示从前面开始,最大匹配 "*[^0-9]"这个表达式,最终匹配到的是"123ABC456DEF",所以最后剩下"789"。
  1. 删除最前面的数字字符串:
    我们希望返回"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
  1. 删除最后面的数字字符串:

请参考3. 删除最前面的数字字符串:中描述的问题和办法。

例子2:路径中提取文件名和目录

var="/home/user/app/example.txt"

echo ${var%/*}      # 返回路径名:/home/user/app
echo ${var##*/}     # 返回文件名:example.txt

例子3:从文件名中提取扩展名

var="example.txt"

echo ${var##*.}      # 返回:txt

相关文章

网友评论

    本文标题:字符串操作之 - 截取匹配

    本文链接:https://www.haomeiwen.com/subject/viyttftx.html