高级Bash脚本编程指南(11):操作字符串

高级Bash脚本编程指南(11):操作字符串

成于坚持,败于止步

Bash所支持的字符串操作的数量多的令人惊讶. 但是不幸的是, 这些工具缺乏统一的标准. 一些是参数替换的子集, 而另外一些则受到UNIX expr命令的影响. 这就导致了命令语法的不一致, 还会引起冗余的功能, 但是这些并没有引起混乱.

得到字符串长度的方法:

一${#string}

二expr length $string

三expr "$string" : '.*'

root@ubuntu:~/resource/shell-study/0507-2013# string="abcdefg"
root@ubuntu:~/resource/shell-study/0507-2013# echo ${#string}
7
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr length $string`
7
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr "$string" : '.*'`
7
root@ubuntu:~/resource/shell-study/0507-2013#

学习一个方法:在一个文本文件的段落之间插入空行

#!/bin/bash

MINLEN=3
while read line
do 
	echo "$line"
	len=${#line}
	if [ "$len" -lt "$MINLEN" ];then
		echo 
	fi
done

exit 0
结果:
root@ubuntu:~/resource/shell-study/0507-2013# ./test6.sh <file.txt 
12345
12

121321313
12

131234
2

123424155
3rwq
e

wer
weee
ee

e

eeeerqwte
root@ubuntu:~/resource/shell-study/0507-2013# 

匹配字符串开头的子串长度

方法一expr match "$string" '$substring'

$substring是一个正则表达式.

方法二expr "$string" : '$substring'

$substring是一个正则表达式.

索引expr index $string $substring通过这种方法在字符串$string中所匹配到的$substring第一次所出现的位置.

root@ubuntu:~/resource/shell-study/0507-2013# string=abcABC123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr index "$string" C12`
6
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr index "$string" A`
4
root@ubuntu:~/resource/shell-study/0507-2013#

提取子串

方法一

${string:position}

在$string中从位置$position开始提取子串,如果$string是"*"或者"@", 那么将会提取从位置$position开始的位置参数

${string:position:length}

在$string中从位置$position开始提取$length长度的子串.

root@ubuntu:~/resource/shell-study/0507-2013# string="abcABC123ABCabc"
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string:0}
abcABC123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string:2}
cABC123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string:8}
3ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string:8:3}
3AB
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string:-4}
abcABC123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string:(-4)}
Cabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string: -4}
Cabc
root@ubuntu:~/resource/shell-study/0507-2013# 
默认是提取整个字符串, 就象${parameter:-default}一样,所以倒数第三个命令返回整个字符串,但是使用圆括号或者添加一个空格可以"转义"这个位置参数,意识是打印倒数四个字符

如果$string参数是"*"或"@", 那么将会从$position位置开始提取$length个位置参数, 但是由于可能没有$length个位置参数了, 那么就有几个位置参数就提取几个位置参数

方法二:

expr substr $string $position $length
在$string中从$position开始提取$length长度的子串

root@ubuntu:~/resource/shell-study/0507-2013# string="abcABC123ABCabc"
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr substr $string 1 2`
ab
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr substr $string 1 4`
abcA
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr substr $string 4 3`
ABC
root@ubuntu:~/resource/shell-study/0507-2013# 

方法三:

expr match "$string" '\($substring\)'

从$string的开始位置提取$substring, $substring是正则表达式.

expr "$string" : '\($substring\)'

从$string的开始位置提取$substring, $substring是正则表达式.

root@ubuntu:~/resource/shell-study/0507-2013# string="abcABC123ABCabc"
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr match "$string" '\(.[b-c]*[A-Z]..[0-9]\)'`
abcABC1
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr "$string" : '\(.[b-c]*[A-Z]..[0-9]\)'`
abcABC1
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr "$string" : '\(.....\)'`
abcAB
root@ubuntu:~/resource/shell-study/0507-2013# 

方法四:

expr match "$string" '.*\($substring\)'

从$string的结尾提取$substring, $substring是正则表达式.

expr "$string" : '.*\($substring\)'

从$string的结尾提取$substring, $substring是正则表达式.

root@ubuntu:~/resource/shell-study/0507-2013# string="abcABC123ABCabc"
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr match "$string" '.*\([A-C][A-C][A-C][a-c]*\)'`
ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr "$string" : '.*\([A-C][A-C][A-C][a-c]*\)'`
ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo `expr "$string" : '.*\(.....\)'`
BCabc
root@ubuntu:~/resource/shell-study/0507-2013# 

子串削除

方法一:

${string#substring}

从$string的开头位置截掉最短匹配的$substring.

${string##substring}

从$string的开头位置截掉最长匹配的$substrin

root@ubuntu:~/resource/shell-study/0507-2013# string="abcABC123ABCabc"
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string#a*c}
ABC123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string#a*C}
123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string##a*C}
abc
root@ubuntu:~/resource/shell-study/0507-2013# 

方法二:

${string%substring}

从$string的结尾位置截掉最短匹配的$substring.

${string%%substring}

从$string的结尾位置截掉最长匹配的$substring.

root@ubuntu:~/resource/shell-study/0507-2013# string="abcABC123ABCabc"
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string%b*c}
abcABC123ABCa
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string%%b*c}
a
root@ubuntu:~/resource/shell-study/0507-2013# 

子串替换

方法一:

${string/substring/replacement}

使用$replacement来替换第一个匹配的$substring.

${string//substring/replacement}

使用$replacement来替换所有匹配的$substring.

root@ubuntu:~/resource/shell-study/0507-2013# string="abcABC123ABCabc"
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string/abc/xyz}
xyzABC123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string//abc/xyz}
xyzABC123ABCxyz
root@ubuntu:~/resource/shell-study/0507-2013# 

方法二:

${string/#substring/replacement}

如果$substring匹配$string的开头部分, 那么就用$replacement来替换$substring.

${string/%substring/replacement}

如果$substring匹配$string的结尾部分, 那么就用$replacement来替换$substring.

这种方法只处理开头部分或者结尾部分,对中间字符没有任何作用
root@ubuntu:~/resource/shell-study/0507-2013# string="abcABC123ABCabc"
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string/#abc/XYZ}
XYZABC123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string/%abc/XYZ}
abcABC123ABCXYZ
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string/%ABC/XYZ}
abcABC123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# echo ${string/#ABC/XYZ}
abcABC123ABCabc
root@ubuntu:~/resource/shell-study/0507-2013# 

先到这里了,O(∩_∩)O~

我的专栏地址:http://blog.csdn.net/column/details/shell-daily-study.html

待续。。。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值