Shell语言用例

字符串操作之 - 截取匹配

2018-02-09  本文已影响1人  CodingCode

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

概说

基本语法

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

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

例子1:基本用法

假定字符串值:

var="123ABC456DEF789"
  1. 提取最前面的数字字符串:
echo ${var%%[^0-9]*}    # 返回:123
  1. 提取最后面的数字字符串:echo ${var##*[^0-9]}
echo ${var##*[^0-9]}    # 返回:789
  1. 删除最前面的数字字符串:
    我们希望返回"BC456DEF789"。
echo ${var#*[^0-9]}    # 返回:BC456DEF789

那该怎么办呢,我也没有找到办法,这个语法该怎么写呢,希望大咖提示。

这有另一种场景可以使用,就是使用特殊字符作为分隔符的。
例子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
上一篇 下一篇

猜你喜欢

热点阅读