Bash Shell字符串操作小结

资料出处:http://my.oschina.net/aiguozhe/blog/41557

资料出处:http://tech.foolpig.com/2008/07/09/linux-shell-char/

1. 取长度

1 str="abcd"
2 expr length $str   # 4
3 echo ${#str}       # 4
4 expr "$str" ".*" # 4

好像一般使用第二种

2. 查找子串的位置

1 str="abc"
2 expr index $str "a"  # 1
3 expr index $str "b"  # 2
4 expr index $str "x"  # 0
5 expr index $str ""   # 0

3. 选取子串

1 str="abcdef"
2 expr substr "$str" 1 3  # 从第一个位置开始取3个字符, abc
3 expr substr "$str" 2 5  # 从第二个位置开始取5个字符, bcdef
4 expr substr "$str" 4 5  # 从第四个位置开始取5个字符, def
5  
6 echo ${str:2}           # 从第二个位置开始提取字符串, bcdef
7 echo ${str:2:3}         # 从第二个位置开始提取3个字符, bcd
8 echo ${str:(-2)}        # 从倒数第二个位置向左提取字符串, abcde
9 echo ${str:(-2):3}      # 从倒数第二个位置向左提取6个字符, cde

 

4. 截取子串 

01 str="abbc,def,ghi,abcjkl"
02 echo ${str#a*c}     # ,def,ghi,abcjkl  一个井号(#) 表示从左边截取最短的匹配
03 echo ${str##a*c}    # jkl,             两个井号(##) 表示从左边截取最长的匹配
04 echo ${str#"a*c"}   # 空,因为str中没有子串"a*c"
05 echo $[str##"a*c"}  # 空,同理
06 echo ${str#d*f)     # abbc,def,ghi,abcjkl,
07 echo ${str#*d*f}    # ,ghi,abcjkl  
08  
09 echo ${str%a*l}     # abbc,def,ghi  一个百分号(%)表示从右边截取最短的匹配
10 echo ${str%%b*l}    # a             两个百分号表示(%%)表示从右边截取最长的匹配
11 echo ${str%a*c}     # abbc,def,ghi,abcjkl

 可以这样记忆, 井号(#)通常用于表示一个数字,它是放在前面的;百分号(%)卸载数字的后面; 或者这样记忆,在键盘布局中,井号(#)总是位于百分号(%)的左边(即前面)    :-)

5. 字符串替换 

1 str="apple, tree, apple tree"
2 echo ${str/apple/APPLE}   # 替换第一次出现的apple
3 echo ${str//apple/APPLE}  # 替换所有apple
4  
5 echo ${str/#apple/APPLE}  # 如果字符串str以apple开头,则用APPLE替换它
6 echo ${str/%apple/APPLE}  # 如果字符串str以apple结尾,则用APPLE替换它

 

6. 比较

1 [[ "a.txt" == a* ]]        # 逻辑真 (pattern matching)
2 [[ "a.txt" =~ .*\.txt ]]   # 逻辑真 (regex matching)
3 [[ "abc" == "abc" ]]       # 逻辑真 (string comparision)
4 [[ "11" "2" ]]           # 逻辑真 (string comparision), 按ascii值比较

 

7. 连接 

1 s1="hello"
2 s2="world"
3 echo ${s1}${s2}   # 当然这样写 $s1$s2 也行,但最好加上大括号

 

8. 翻转

 

shell字符串的截取的问题:
一、Linux shell 截取字符变量的前8位,有方法如下:
1.expr substr “$a” 1 8
2.echo $a|awk ‘{print substr(,1,8)}’
3.echo $a|cut -c1-8
4.echo $
5.expr $a : ‘\(.\\).*’
6.echo $a|dd bs=1 count=8 2>/dev/null

二、按指定的字符串截取
1、第一种方法:
${varible##*string} 从左向右截取最后一个string后的字符串
${varible#*string}从左向右截取第一个string后的字符串
${varible%%string*}从右向左截取最后一个string后的字符串
${varible%string*}从右向左截取第一个string后的字符串
“*”只是一个通配符可以不要

例子:
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg

2、第二种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。

可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga

这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。

三、按照指定要求分割:
比如获取后缀名
ls -al | cut -d “.” -f2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值