在Linux的Shell脚本中,#
和%
用于字符串截取,通过通配符模式匹配删除部分内容
批量修改文件名技巧:Linux下#、##、%、%%符号操作详解-CSDN博客
从左截取(#
和 ##
)
-
#
:删除最短匹配左侧内容。 -
##
:删除最长匹配左侧内容。
path="/home/user/docs/file.txt"
echo ${path#*/} # 输出 "home/user/docs/file.txt"(删除第一个/及左侧)
echo ${path##*/} # 输出 "file.txt"(删除最后一个/及左侧)
从右截取(%
和 %%
)
-
%
:删除最短匹配右侧内容。 -
%%
:删除最长匹配右侧内容。
file="data.tar.gz"
echo ${file%.*} # 输出 "data.tar"(删除最后一个.及右侧)
echo ${file%%.*} # 输出 "data"(删除第一个.及右侧)
常见用例
提取文件名:
path="/path/to/file.txt"
filename=${path##*/} # 输出 "file.txt"
提取目录路径:
dir=${path%/*} # 输出 "/path/to"
去除文件扩展名:
name=${file%.*} # 输出 "data.tar"(针对多级扩展)
获取文件后缀:
suffix=${file##*.} # 输出 "gz"
注意事项
-
贪婪匹配:双符号(
##
或%%
)会尽可能多删除匹配内容。 -
无匹配时:若模式未匹配,返回原字符串。
-
通配符支持:使用
*
、?
、[...]
等通配符进行模式匹配。
示例解析
url="http://example.com/path"
domain=${url#*//} # 删除"http://",得 "example.com/path"
domain=${domain%%/*} # 删除最长右侧匹配,得 "example.com"
-
#
和##
从左删除,适用于提取右侧内容。 -
%
和%%
从右删除,适用于提取左侧内容。