跳转至

Shell脚本字符串截取/替换

Linux 的字符串截取、替换很有用。

假设有变量 var=http://www.aaa.com/123.htm

先总结

Bash
# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 %  $ 之右边)
单一符号是最小匹配;两个符号是最大匹配

*是用来匹配不要的字符,也就是想要去掉的那部分
还有指定字符分隔号,与*配合,决定取哪部分

*属于正则表达,也可以使用其它去匹配值
比如: var=https
我想删除最后一个字符s,可以这样写
echo ${var%?}
输出: http

1. #号截取,从左匹配第一个,删除前边字符,保留后边字符

假设有变量 var=http://www.aaa.com/123.htm

Bash
1
2
3
4
5
echo ${var#*//}

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm

2. ##号截取,从左匹配最后一个,删除前边字符,保留后边字符

假设有变量 var=http://www.aaa.com/123.htm

Bash
1
2
3
4
5
echo ${var##*/}

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是: 123.htm

3. %号截取,从右匹配第一个,删除后边字符,保留前边字符

假设有变量 var=http://www.aaa.com/123.htm

Bash
1
2
3
4
echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com

4. %%号截取,从右匹配最后一个,删除后边字符,保留前边字符

假设有变量 var=http://www.aaa.com/123.htm

Bash
1
2
3
4
echo ${var%%/*}

%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:

5. 从左边截取前5个字符

假设有变量 var=http://www.aaa.com/123.htm

Bash
1
2
3
4
echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:

6. 从左边第8个字符开始,一直到结束

假设有变量 var=http://www.aaa.com/123.htm

Bash
1
2
3
4
echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm

7. 从后边第7个字符开始,截取前3个字符

假设有变量 var=http://www.aaa.com/123.htm

Bash
1
2
3
4
echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123

8. 从后边第7个字符开始,一直到结束

假设有变量 var=http://www.aaa.com/123.htm

Bash
1
2
3
4
5
echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

9. / 替换第一个匹配的字符,也可以删除

假设有变量 var=http://www.aaa.com/123.htm

Bash
替换www为aaa:
echo ${var/www/aaa}

表示将第一个匹配的 www 替换为 aaa
结果是:http://aaa.aaa.com/123.htm

删除www.: 
echo ${var/www./}

删除在斜杠后不需要跟值
结果是:http://aaa.com/123.htm

10. // 替换所有匹配到的字符,也可以删除

假设有变量 var=http://aaa.aaa.com/123.htm

Bash
替换所有aaa为bbb:
echo ${var//aaa/bbb}

表示将匹配的所有 aaa  替换为 bbb
结果是:http://bbb.bbb.com/123.htm

删除所有aaa.:
echo ${var//aaa./}

使用双斜杠删除所有匹配
结果是: http://com/123.htm

11. ${#var} 获取变量长度

假设有变量 var=http://

Bash
1
2
3
echo ${#var}

获取变量字符长度,结果是: 7