替换
格式: ${parameter/pattern/string}
${parameter/pattern/string}
${parameter//pattern/string}
说明
pattern
的扩展和filename expansion
一样;
parameter
则是直接替换; 并且pattern
最长匹配的字符串被替换成string
; 即贪婪模式;
pattern
正则后续介绍;
/pattern
表示所有匹配都替换; 贪婪模式;
pattern
第一个匹配替换
#pattern
以pattern
开头才替换;
%pattern
以pattern
结尾才替换;
string
为空表示删除匹配;
shopt -s nocasematch
不区分大小写;
parameter
是@, *
, 则对所有的函数参数挨个处理; 结果是list
类型;
var[@], var[*]
同理, 对每个参数替换, 返回仍是list
;
匹配大小写
格式
${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}
说明
功能是将paramter
中匹配pattern
的首字母大写或小写;
pattern
的正则类似file
^
大写, ,
小写;
单个^,
只匹配一个就终止, 两个则是匹配所有;
同样@*
会对每个都进行处理并返回对应类型;
正则
说明
非特殊字符表示本身, 特殊字符表示集合; \
则转义, 特殊符号将变成本身;
*
任意字符字符串, 包括空字符;
*
不匹配/
, **
匹配/
; **/
仅匹配文件夹;
?
匹配任意单个字符
[...]
字符表示本身
a-z
, -
表示区间; 包含;
!^
表示对罗列集合取反;
集合和所在地区有关, 因为地区不同, 范围内的字符不同, 比如a-z
表示小写的a
到z
, 共26
个字符, 而有的国家则是52
, 因为他们的排列是aAbBcC...Zz
这种;
特殊集合[:class:]
# 后面两种格式少见, 有得甚至不识别;
[:class:] [=class=] [.class.]
# class 可以下面的任意一个
alnum
alpha
ascii
blank
cntrl
digit
graph
lower
print
punct
space
upper
word
xdigit
复合, shopt -s extglob
打开才能使用
可以多个正则; |
分隔;
?(pattern-list)
Matches zero or one occurrence of the given patterns.
*(pattern-list)
Matches zero or more occurrences of the given patterns.
+(pattern-list)
Matches one or more occurrences of the given patterns.
@(pattern-list)
Matches one of the given patterns.
!(pattern-list)
Matches anything except one of the given patterns.
注: 不好用建议用sed
正则替换更优; 或者python re
;
https://www.gnu.org/software/sed/manual/
https://docs.python.org/3.8/library/re.html