Bash对字符串的处理

变量定义
bash 中,直接定义
# strs='x1x12y2y1x1x'
awk 中,定义
两种方法,第一种,直接定义
# awk 'BEGIN{strs="x1x12y2y1x1x"}' /dev/null
第二种,使用-v参数
# awk -v strs=$strs
python 中,直接定义
>>> strs='x1x12y2y1x1x'
注意:文章中提到的替换,并不改变实际变量的值,只是基于原来的变量做一些运算,输出结果而已。
  1. 字符串长度:${#str}
    # echo ${#strs}
    12
    或者,awk中使用length系统函数
    # awk -v strs=$strs 'END{print length(strs)}' /dev/null
    12
    或者,expr中使用length命令
    # expr length $strs
    12
    或者,python中使用len属性
    >>> len(strs)
    12
     
  2. 求子串,特定段的字符串:${str:index:length}
    求第2个字符开始步长为3:
    echo ${strs:1:3}
    1x1
    注意:如果是反向取,如取倒数第三个开始到末尾,${strs:-(3)},不是${strs:-3}。
    # echo ${strs:(-3)}
    x1x
     
  3. 求子串,通用的做法
    建议awk的的 substr命令来实现
    substr(s, i [, n])      Returns  the at most n-character substring of s starting at i.  If n is omitted, the rest of s is used.(man awk)
    使用的场景极少。
  4. 掐头去尾
    掐头,去掉前边的x1x12:
    echo ${strs/*12}
    y2y1x1x
    去尾,去掉后从12开始的所有字符:
    # echo ${strs/12*}
    x1x
    注意:如果想明确标示去掉开头或结尾的某几个字符,则需要使用${strs/#str1}或${strs/%str1}。
    # echo ${strs/#x1x/}
    12y2y1x1x
    [root@localhost ~]# echo ${strs/%x1x/}
    x1x12y2y1
     
  5. 字符替换
    与掐头去尾类似。可以使用${strs/str1/str2}或${strs//str1/str2}来完成,可以把掐头去尾当作是字符替换的特例,在这里分别表示 自左向右,替换str1为str2一次和替换所有的str1为str2。
    如果明确标示匹配的方向,需要用${strs/#str1/str2}或${strs/%str1/str2}代替,分别表示 自左向右匹配后替换,自右向左匹配后替换。
    [root@localhost ~]# echo ${strs/#x1x/555}
    55512y2y1x1x
    [root@localhost ~]# echo ${strs/%x1x/555}
    x1x12y2y1555
  6. 是否初始化或为空:${strs-str1}或${str:-str1}
    对于一个未初始化的变量,和一个值为空的变量在脚本中一般不做区分,但是难免会有极端的情况。
    ${strs-str1}或${str:-str1},前者表示如果变量strs未初始化,则运算结果替换为str1;后者表示如果strs变量为空时,则运算结果替换为str1。

    有这样一个变量 unint
    看一下这两个值:${unint:-未初始化或值为空} 和 ${unint-未初始化或值为空}
    [root@localhost ~]# echo ${unint:-未初始化或值为空}
     
  7. 未初始化或值为空
    [root@localhost ~]# echo ${unint-未初始化或值为空}
    未初始化或值为空
    现在我们把unint换成inted,初始化它为空串
    inted=""
    [root@localhost ~]# echo ${inted-未初始化}
    [root@localhost ~]# echo ${inted:-为空}
    为空
  8. 大小写转化
    请查阅:Linux下大小写转换方法全析[超级简单]
    http://wangxiaoyu.blog.51cto.com/922065/197623