zoukankan      html  css  js  c++  java
  • SHELL字符串使用总结

    1、获取字符串的长度,${#str}

    #设置字符串
    $ str="liqiu"
    #打印字符串
    $ echo $str
    liqiu
    #继续打印字符串
    $ echo ${str}
    liqiu
    #打印字符串长度
    $ echo ${#str}
    5

    2、在段落后面增加空行

    #!/bin/bash
    # paragraph-space.sh
     
    # 在一个单倍行距的文本文件中插入空行.
    # Usage: $0 < FILENAME
      
    MINLEN=45        # 可能需要修改这个值。假定行的长度小于$MINLEN所指定的长度的时候才认为此段结束。
     
    while read line  # 提供和输入文件一样多的行...
    do
       echo "$line"   # 输入所读入的行本身.
      
       len=${#line}
       if [ "$len" -lt "$MINLEN" ]
         then echo    # 在短行(译者注: 也就是小于$MINLEN个字符的行)后面添加一个空行.
       fi 
    done
    
    exit 0

    3、查看字符串出现的位置

    stringZ=abcABC123ABCabc
    echo `expr index "$stringZ" C12`             # 6
     
    echo `expr index "$stringZ" 1c`              # 3

    4、字符串替换

    curr_date="2014-08-08"
    table_curr_date=${curr_date//-/_} #结果:2014_08_08

    5、字符串分割

    5.1 基本方法

    #1. bash提供的数组数据结构,它是以数字为下标的,和C语言从0开始的下标一样
    $ var="get the length of me"
    $ var_arr=($var)    #这里把字符串var存放到字符串数组var_arr中了,默认以空格作为分割符
    $ echo ${var_arr[0]} ${var_arr[1]} ${var_arr[2]} ${var_arr[3]} ${var_arr[4]}
    get the length of me
    $ echo ${var_arr[@]}    #这个就是整个字符串所有部分啦,这里可以用*代替@,下同
    get the length of me
    $ echo ${#var_arr[@]}    #记得上面求某个字符串的长度么,#操作符,如果想求某个数组元素的字符串长度,那么就把@换成下标吧
    5
    # 你也可以直接给某个数组元素赋值
    $ var_arr[5]="new_element"
    $ echo ${var_arr[5]}
    6
    $ echo ${var_arr[5]}
    new_element
    # bash里头实际上还提供了一种类似于“数组”的功能,即"for i in 用指定分割符分开的字符串" 的用法 即,你可以很方便的获取某个字符串的某个部分
    $  for i in $var; do echo -n $i" "; done;
    get the length of me  
    

    5.2 awk方法

    #2. awk里头的数组,注意比较它和bash提供的数组的异同
    # split把一行按照空格分割,存放到数组var_arr中,并返回数组的长度。注意:这里的第一个元素下标不是0,而是1
    $ echo $var | awk '{printf("%d %s
    ", split($0, var_arr, " "), var_arr[1]);}'
    5 get
    # 实际上,上面的操作很类似awk自身的行处理功能:awk默认把一行按照空格分割为多个域,并可以通过$1,$2,$3...来获取,$0表示整行
    # 这里的NF是该行的域的总数,类似于上面数组的长度,它同样提供了一种通过“下标”访问某个字符串的功能
    $ echo $var | awk '{printf("%d | %s %s %s %s %s | %s
    ", NF, $1, $2, $3, $4, $5, $0);}'
    5 | get the length of me | get the length of me
    # awk的“数组”功能何止于此呢,看看它的for引用吧,注意,这个和bash里头的for不太一样,i不是元素本身,而是下标
    $ echo $var | awk '{split($0, var_arr, " "); for(i in var_arr) printf("%s ",var_arr);}'
    get the length of me 
    $ echo $var | awk '{split($0, var_arr, " "); for(i in var_arr) printf("%s ",i);}'
    1 2 3 4 5 
    # awk还有更“厉害”的处理能力,它的下标可以不是数字,而可以是字符串,从而变成了“关联”数组,这种“关联”的作用在某些方便将让我们非常方便
    # 比如,我们这里就实现一个非凡的应用,把某个文件中的某个系统调用名替换成地址,如果你真正用起它,你会感慨它的“鬼斧神工”的。
    # 这就是我在一个场合最好才发现的随好的实现方案:有兴趣看看awk手册帖子中我在3楼回复的实例吧。
    $ cat symbol 
    sys_exit
    sys_read
    sys_close
    $ ls /boot/System.map*
    $ awk '{if(FILENAME ~ "System.map") map[$3]=$1; else {printf("%s
    ", map[$1])}}' /boot/System.map-2.6.20-16-generic symbol 
    c0129a80
    c0177310
    c0175d80
    # 另外,awk还支持删除某个数组元素,如果你不用了就可以用delete函数给删除掉。如果某些场合有需要的话,别忘了awk还支持二维数组。

    6、字符串分割

    $ var="get the length of me"
    $ echo ${var%% *} #从右边开始计算,删除最左边的空格右边的所有字符 get $ echo ${var% *} #从右边开始计算,删除第一个空格右边的所有字符 get the length of $ echo ${var##* } #从左边开始计算,删除最右边的空格左边的所有字符 me $ echo ${var#* } #从左边开始计算,删除第一个空格左边的所有字符 the length of me

    7、字符串截取

    // 按照位置取子串,比如从什么位置开始,取多少个字符
    $ var="get the length of me"
    $ echo ${var:0:3}
    get
    $ echo ${var:(-2)}   # 方向相反呢
    me
    $ echo `expr substr "$var" 5 3` #记得把$var引起来,否则expr会因为空格而解析错误
    the
    $ echo $var | awk '{printf("%s
    ", substr($0, 9, 6))}'
    length 
    
    $ echo $var | awk '{printf("%s
    ", $1);}' # awk把$var按照空格分开为多个变量,依次为$1,$2,$3,$4,$5
    get
    $ echo $var | awk '{printf("%s
    ", $5);}'
    me
     
    $ echo $var | cut -d" " -f 5  #差点把cut这个小东西忘记啦,用起来和awk类似, -d指定分割符,如同awk用-F指定分割符一样,-f指定“域”,如同awk的$数字。
     
    $ echo $var | sed 's/ [a-z]*//g'  #删除所有 空格+字母串 的字符串,所以get后面的全部被删除了
    get
    $ echo $var | sed 's/[a-z]* //g'
    me
     
    $ echo $var | tr " " "
    " | sed -n 1p #sed有按地址(行)打印(p)的功能,记得先用tr把空格换成行号
    get
    $ echo $var | tr " " "
    " | sed -n 5p
    me
     
    // tr也可以用来取子串哦,它也可以类似#和%来“拿掉”一些字符串来实现取子串
    $ echo $var | tr -d " "
    getthelengthofme
    $ echo $var | tr -cd "[a-z]" #把所有的空格都拿掉了,仅仅保留字母字符串,注意-c和-d的用法
    getthelengthofme
  • 相关阅读:
    导弹拦截
    背包求方案的字典序
    分组背包
    关于字符串的简单dp
    dp进阶——饥饿的奶牛
    压缩维度oj P1173+P1174+P1164
    搜索——迭代加深
    委外倒冲领料
    QLIKVIEW-SALESORDERDELIVERYNOTICEOUTSTOCKINVOICE
    设置采购订单供应商权限设置
  • 原文地址:https://www.cnblogs.com/liqiu/p/3914999.html
Copyright © 2011-2022 走看看