zoukankan      html  css  js  c++  java
  • Shell 04 字符串处理、正则表达式

    一.字符串的处理
     
    1.字符串截取
    1.1 s{}表达式  ${变量名:起始位置:长度} (从0开始)
    n=number (n="number")
    echo ${#n}   ----> 6
    echo ${n:0:4}----> numb
    echo ${n:1:3} ---> umb
    1.2 使用 expr substr  格式:expr substr "$变量名" 起始位置 长度(从1开始)
    n=number
    expr substr "$n" 1 3   -----> num
    expr substr "$n" 2 5   -----> umber
    1.3 方式三,使用cut分割工具(从1开始)
    格式:echo $变量名 | cut -b 起始位置-结束位置 可省略任何一个
    (编号也是从1开始,与expr类似),当省略结束位置时,视为截取到最后
    选项 -b 表示按字节截取字符,其中起始位置、结束位置都可以省略。当省略起始位置时,视为从第1个字符开始
    n=number
    echo $n                ----> number
    echo $n | cut -b 1-3   ----> num
    echo $n | cut -b -3    ----> num
     
    echo $n | cut -b 1-    ----> number
    echo $n | cut -b 1,3,5 ----> nme
     
    2.字符串的替换 n=13152098678
    2.1 替换第一个
    echo ${n/8/x}     ----> 1315209x678
    2.2 替换全部
    echo ${n//8/x}    ----> 1315209x67x
     
    3.字符串的删除
    A=`head -1 /etc/passwd`   echo A=root:x:0:0:root:/root:/bin/bash
    3.1 从左向右,最短距离匹配 格式:${A#*key}
    echo ${A#*:}    --->x:0:0:root:/root:/bin/bash  删除了:root:
    3.2从左向右,最长距离匹配 格式:${A##*key}
    echo ${A##*:}   --->/bin/bash   删除了:root:x:0:0:root:/root:
    3.3 从右向左,最短匹配删除 格式:${A%key*}
    echo ${A%:*}    ---> root:x:0:0:root:/root 删除了::/bin/bash
    3.4 从右向左,最长匹配删除 格式:${A%%key*}
    echo ${A%%:*}   ---> root 删除了::x:0:0:root:/root:/bin/bash
    案例: 批量修改文件名
    案例:字符串拼接:
                 1.  a=f
       y被定义:   2.   y=$a       y=f  (1-2步骤等同于:y=$y$a,即可以直接定义赋值)
                     y=$y$a     y=ff
                     y=$y$a     y=fff  
                          ...           ...
    二.字符串初值的处理
    1.常见方法 xx=11
    1.1 只取值 格式:${var:-word}
    若变量var已存在且非空,则返回$var的值,否则返回字符串“word",原变量var不受影响
    echo ${xx:-123qwe}     ----> 11
    echo ${yy:-456qwe}     ----> 456qwe
    案例:编写脚本,从1叠加求和用户输入的一个值(初值)
    #!/bin/bash
    read -p "Please input a number:" num
    num=${num:-1}
    echo $num
    s=0
    i=0
    while [ $i -lt $num ]
    do
      let i++
      let s+=i
    done
    echo $s
    1.2 数组的定义
    # x=(11 22 33)
    # echo $x      ---> 11
    # echo ${x[2]} ---> 33
    # x[1]=22
    # echo ${x[1]} ---> 22
    # echo ${x[@]} ---> 11  22 33
    # echo ${#x[@]}   数组长度
    # echo ${x[@]:起始下标:元素个数}
    #  数组的另一种赋值方法:
       m[0]=aaa
       m[1]=bbb
        ...
    三.expect预期交互
    #!/bin/bash
    expect << EOF   #开始
     
    spawn ssh 176.233.6.123
    expect "password:" { send "Taren1 " }
    expect "#" { send "mkdir /opt/zhangkai " }
    expect "#" { send "exit " }
    EOF             #结束
    四.正则表达式
    1.egrep过滤工具
    基本用法:egrep [选项]  '正则表达式'   文件
               前值命令 | egrep [选项] '正则表达式'
    grep -E 标示允许使用扩展的正则表达式
         -i 忽略字母大小写
         -v 条件取反
         -c 统计匹配的行数
         -q 无任何输出,一般用于检测($?)
         -n 显示出匹配结果所在的行号
         --color 标红显示匹配字串
    # grep -c      root /etc/passwd  (输出的是一共匹配的行数)
    # grep --color root /etc/passwd
    2.基本元素处理
    2.1 行首/行尾/单字匹配
    ^  匹配行首  ^abc   以abc开头的行
    $  匹配行尾  abc$   以abc结尾的行
    ^$ 空行   
    [ ] 匹配集合中任意单个字符
    [ ^ ] 对集合取反
    .  单个字符   .       除过“ ”以外的任意单个字符   
    {n,m} 匹配任一个字符n-m次 (优先匹配大数,依次往小去匹配)
    示例:egrep '^#' /etc/inittab    
            egrep -c '/bin/bash$' /etc/passwd == egrep '/bin/bash$' /etc/passwd | wc -l =5(行数)
            egrep -m10 '/sbin/nologin$' /etc/passwd    (只匹配10行,不是前10行,是中标后列出中标的10行)
            grep -v '.' /etc/rc.local  == egrep '^$' /etc/rc.local
            grep -n 'a{3,4} --->aaa aaaa aaa
            grep -n 'a{3,}  ---> aaa (匹配3次及3次以上,由高往底匹配)g
              (.表示有一个字就行,前面-v表示一个字都没有,即空行)
    2.2 +、?、*       -----> 目标出现的次数
    类型     含义              示例           说明
    +        最少匹配一次     a+          一个或多个连续的a
                         (abc)+       一个或多个连续的abc  
    ?        最多匹配一次     a?          0个或1个a
                         (abc)?       0个或1个abc
    *         匹配任意次数    a*           0个或多个连续的a
                         (abc)*       0个或多个连续的abc
                               .*               任意长度的任意字符串
    2.3 限定次数
  • 相关阅读:
    [译]Vulkan教程(03)开发环境
    [译]Vulkan教程(02)概况
    [译]Vulkan教程(01)入门
    CSharpGL(57)[译]Vulkan清空屏幕
    CSharpGL(56)[译]Vulkan入门
    CSharpGL(55)我是这样理解PBR的
    CSharpGL(54)用基于图像的光照(IBL)来计算PBR的Specular部分
    [译]背景:着色的物理和数学(4)
    [译]背景:着色的物理和数学(3)
    [译]背景:着色的物理和数学(2)
  • 原文地址:https://www.cnblogs.com/luwei0915/p/10496646.html
Copyright © 2011-2022 走看看