linux有很多命令可以对字符串进行操作,譬如awk,sed,但是在shell脚本如果能使用bash内建的操作符完成操作就尽量不要使用外部命令,因为外部命令通常都需要fork出一个单独的进程来执行,这会降低脚本执行效率;
[size=medium][b]1.获取字符串长度[/b][/size]
[table]
|[b]bash语法:[/b]${#字符串}|
[/table]
[b]我们用awk实现同样的功能[/b]
[size=medium][b]2.截取子串[/b][/size]
[table]
|[b]bash语法[/b]:|
|${字符串:positon} |
|${字符串:positon:length} |
[/table]
bash中字符串下标从0开始,若不指定长度,默认截至的最后一个字符
[b]我们用awk实现同样的功能(awk中字符串下标从1开始):[/b]
[size=medium][b]3.字符串替换[/b][/size]
[table]
|[b]bash语法[/b]:|
|${字符串/pattern/replacement} [color=green] #使用$replacement来替换第一个匹配的$pattern[/color]|
|${字符串//pattern/replacement} [color=green]#使用$replacement来替换所有匹配的$pattern[/color]|
[/table]
注意:这里的pattern 支持bash通配符(不支持正则)
[b]我们用awk实现同样的功能:[/b]
[b]关于字符串替换,还有2点要说明:[/b]
1.gsub支持正则(扩展正则),比如上面的例子我们还可以写成:[b]awk -v s="$str" 'BEGIN {gsub(/[0-9]+/,"--",s); print s}'[/b]
2.bash字符串替换还支持定址:
[table]
|${字符串/#substring/replacement} [color=green] #若substring出现在开头,则替换[/color]|
|${字符串/%substring/replacement} [color=green] #若substring出现在末尾,则替换[/color]|
[/table]
[size=medium][b]1.获取字符串长度[/b][/size]
[table]
|[b]bash语法:[/b]${#字符串}|
[/table]
$ str="hello world"
$ echo ${#str}
11
[b]我们用awk实现同样的功能[/b]
$ str="hello world"
$ awk -v s="$str" 'BEGIN {print length(s)}' #注意$str两边的双引号不能省略
11
[size=medium][b]2.截取子串[/b][/size]
[table]
|[b]bash语法[/b]:|
|${字符串:positon} |
|${字符串:positon:length} |
[/table]
bash中字符串下标从0开始,若不指定长度,默认截至的最后一个字符
$ str="abcdefghijk"
$ echo "${str:2}"
cdefghijk
$ echo "${str:2:5}"
cdefg
[b]我们用awk实现同样的功能(awk中字符串下标从1开始):[/b]
$ str="abcdefghijk"
$ awk -v s="$str" 'BEGIN {print substr(s,3)}'
cdefghijk
$ awk -v s="$str" 'BEGIN {print substr(s,3,5)}'
cdefg
[size=medium][b]3.字符串替换[/b][/size]
[table]
|[b]bash语法[/b]:|
|${字符串/pattern/replacement} [color=green] #使用$replacement来替换第一个匹配的$pattern[/color]|
|${字符串//pattern/replacement} [color=green]#使用$replacement来替换所有匹配的$pattern[/color]|
[/table]
注意:这里的pattern 支持bash通配符(不支持正则)
$ str="a1b1c1"
$ echo "${str/1/--}"
a--b1c1
$ echo "${str//1/--}"
a--b--c--
[b]我们用awk实现同样的功能:[/b]
$ str="a1b1c1"
$ awk -v s="$str" 'BEGIN {gsub("1","--",s); print s}'
a--b--c--
[b]关于字符串替换,还有2点要说明:[/b]
1.gsub支持正则(扩展正则),比如上面的例子我们还可以写成:[b]awk -v s="$str" 'BEGIN {gsub(/[0-9]+/,"--",s); print s}'[/b]
2.bash字符串替换还支持定址:
[table]
|${字符串/#substring/replacement} [color=green] #若substring出现在开头,则替换[/color]|
|${字符串/%substring/replacement} [color=green] #若substring出现在末尾,则替换[/color]|
[/table]
$ str="ba1b1c1"
$ echo ${str/a/--}
b--1b1c1
$ echo ${str/#a/--}
ba1b1c1