• shell 字符串操作


    得到长度
    代码:

    %x="abcd"
    #方法一
    %expr length $x
    4
    # 方法二
    靐o $
    4
    # 方法三
    %expr "$x" : ".*"
    4
    # expr 的帮助
    # STRING : REGEXP anchored pattern match of REGEXP in STRING

    查找子串
    代码:

    %expr index $x "b"
    2
    %expr index $x "a"
    1
    %expr index $x "b"
    2
    %expr index $x "c"
    3
    %expr index $x "d"
    4


    得到子字符串
    代码:

    # 方法一
    # expr <string> startpos length
    %expr substr "$x" 1 3
    abc
    %expr substr "$x" 1 5
    abcd
    %expr substr "$x" 2 5
    bcd
    # 方法二
    # $
    靐o $
    bcd
    靐o $
    cd
    靐o $
    abcd
    靐o $
    ab
    %pos=1
    %len=2
    靐o $
    bc



    匹配正则表达式
    代码:

    # 打印匹配长度
    %expr match $x "."
    1
    %expr match $x "abc"
    3
    %expr match $x "bc"
    0



    字符串的掐头去尾
    代码:

    %x=aabbaarealwwvvww
    靐o "$"
    aabbaarealwwvv
    靐o "$"
    aabbaareal
    靐o "$"
    lwwvvww
    靐o "$"
    bbaarealwwvvww


    其中 , # 表示掐头, 因为键盘上 # 在 $ 的左面。
    其中 , % 表示%, 因为键盘上 % 在 $ 的右面。
    单个的表示最小匹配,双个表示最大匹配。
    也就是说,当匹配的有多种方案的时候,选择匹配的最大长度还是最小长度。

    字符串的替换
    代码:

    %x=abcdabcd
    靐o $ # 只替换一个
    bbcdabcd
    靐o $ # 替换所有
    bbcdbbcd


    不可以使用 regexp , 只能用 * ? 的文件扩展方式

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    对字符串的处理
    包括:截取,连接,匹配,替换,翻转... ... 
    字符串的处理:
    1,截取
    方法一:
    echo $a|awk '{print substr( ,1,8)}'
    substr是awk中的一个子函数,对第一个参数的进行截取,从第一个字符开始,共截取8个字符,如果不够就从第二个字符中补
    方法二
    echo $a|cut -b2-8
    cut:对标准输入的字符串进行处理
    cut -bn-m:以byte为单位,从第n个byte开始,取m个
    cut -bn,m:以byte为单位,截取第n,m个byte
    cut -b-n,m:以byte为单位,截取1-n,和第m个
    -c:以charactor为单位
    -d:指定分隔符,默认为tab
    -s:使标准输入中没有delimeter
    cut -f1:截取第1个域
    方法三
    a=123456
    echo $
    方法四
    使用sed截取字符串的最后两位
    echo $test |sed 's/\(.*\)\(..\)$//'
    截取字符串的前2位
    echo $test |sed 's/^\(..\)\(.*\)//'
    欢迎访问007电脑资讯
    2,比较
    好像没有什么可以比较的
    3,连接
    $a$b
    或者
    $string
    4,翻转
    方法一
    使用rev命令
    方法二
    编写脚本实现
    #!/usr/bin/awk -f
    ################################################################
    # Description : duplicate rev in awk
    ################################################################
    {
    revline = ""
    for (i=1;i<=length;i++)
    {
    revline = substr(,i,1) revline
    }
    }
    END{print revline}

    5,匹配
    grep
    egrep
    fgrep
    6,排序
    7,替换
    bash中:
    %x=abcdabcd
    %echo $ # 只替换一个
    bbcdabcd
    %echo $ # 替换所有
    bbcdbbcd
    sh中:
    ??
    如何替换/
    使用sed
    替换所有匹配
    echo $test |sed 's/xx/yy'
    替换单个匹配
    ??
    8,得到字符串的长度:
    bash当中
    $
    或者
    expr "$VAR" : '.*'
    9,判断字符串是否为数字
    10,得到字符串中某个字符的重复次数
    echo $a |tr "x" "\n" |wc -l
    得到的结果需要减去1
    或者 echo $a |awk -F"x" '{print NF-1}'
    11,得到字符串中某个string的重复次数 007电脑资讯
    12,将一批文件中的所有string替换
    for i in file_list
    do
    vi $i <<-!
    :g/xxxx/s//XXXX/g
    :wq
    !
    done
    13,如何将字符串内每两个字符中间插入一个字符
    使用sed
    echo $test |sed 's/../&[insert char]/g'

    ============================================================================

    象专业人员那样截断字符串


    尽管 basename 和 dirname 是很好的工具,但有时可能需要执行更高级的字符串“截断”,而不只是标准的路径名操作。当需要更强的说服力时,可以利用 bash 内置的变量扩展功能。已经使用了类似于 ${MYVAR} 的标准类型的变量扩展。但是 bash 自身也可以执行一些便利的字符串截断。看一下这些例子:


    第一种方法:

    ${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

    在第一个例子中,输入了 ${MYVAR##*fo}。它的确切含义是什么?基本上,在 ${ } 中输入环境变量名称,两个 ##,然后是通配符 ("*fo")。然后,bash 取得 MYVAR,找到从字符串 "foodforthought.jpg" 开始处开始、且匹配通配符 "*fo" 的 最长 子字符串,然后将其从字符串的开始处截去。刚开始理解时会有些困难,为了感受一下这个特殊的 "##" 选项如何工作,让我们一步步地看看 bash 如何完成这个扩展。首先,它从 "foodforthought.jpg" 的开始处搜索与 "*fo" 通配符匹配的子字符串。以下是检查到的子字符串:


    f   
    fo      MATCHES *fo
    foo
    food
    foodf      
    foodfo      MATCHES *fo
    foodfor
    foodfort   
    foodforth
    foodfortho  
    foodforthou
    foodforthoug
    foodforthought
    foodforthought.j
    foodforthought.jp
    foodforthought.jpg



    在搜索了匹配的字符串之后,可以看到 bash 找到两个匹配。它选择最长的匹配,从初始字符串的开始处除去,然后返回结果。

    上面所示的第二个变量扩展形式看起来与第一个相同,但是它只使用一个 "#" -- 并且 bash 执行 几乎同样的过程。它查看与第一个例子相同的子字符串系列,但是 bash 从初始字符串除去 最短 的匹配,然后返回结果。所以,一查到 "fo" 子字符串,它就从字符串中除去 "fo",然后返回 "odforthought.jpg"。

    这样说可能会令人十分困惑,下面以一简单方式记住这个功能。当搜索最长匹配时,使用 ##(因为 ## 比 # 长)。当搜索最短匹配时,使用 #。看,不难记吧!等一下,怎样记住应该使用 '#' 字符来从字符串开始部分除去?很简单!注意到了吗:在美国键盘上,shift-4 是 "$",它是 bash 变量扩展字符。在键盘上,紧靠 "$" 左边的是 "#"。这样,可以看到:"#" 位于 "$" 的“开始处”,因此(根据我们的记忆法),"#" 从字符串的开始处除去字符。您可能要问:如何从字符串末尾除去字符。如果猜到我们使用美国键盘上紧靠 "$" 右边 的字符 ("%),那就猜对了。这里有一些简单的例子,解释如何截去字符串的末尾部分:



    $ MYFOO="chickensoup.tar.gz"
    $ echo ${MYFOO%%.*}
    chickensoup
    $ echo ${MYFOO%.*}
    chickensoup.tar



    正如您所见,除了将匹配通配符从字符串末尾除去之外,% 和 %% 变量扩展选项与 # 和 ## 的工作方式相同。请注意:如果要从末尾除去特定子字符串,不必使用 "*" 字符:



    MYFOOD="chickensoup"
    $ echo ${MYFOOD%%soup}
    chicken

    在此例中,使用 "%%" 或 "%" 并不重要,因为只能有一个匹配。还要记住:如果忘记了应该使用 "#" 还是 "%",则看一下键盘上的 3、4 和 5 键,然后猜出来。

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


    可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:



    $ EXCLAIM=cowabunga
    $ echo ${EXCLAIM:0:3}
    cow
    $ echo ${EXCLAIM:3:7}
    abunga



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

    应用字符串截断


    现在我们已经学习了所有截断字符串的知识,下面写一个简单短小的 shell 脚本。我们的脚本将接受一个文件作为自变量,然后打印:该文件是否是一个 tar 文件。要确定它是否是 tar 文件,将在文件末尾查找模式 ".tar"。如下所示:

    mytar.sh -- 一个简单的脚本

    #!/bin/bash

    if [ "${1##*.}" = "tar" ]
    then
        echo This appears to be a tarball.
    else
        echo At first glance, this does not appear to be a tarball.
    fi



    要运行此脚本,将它输入到文件 mytar.sh 中,然后输入 "chmod 755 mytar.sh",生成可执行文件。然后,如下做一下 tar 文件试验:



    $ ./mytar.sh thisfile.tar
    This appears to be a tarball.
    $ ./mytar.sh thatfile.gz
    At first glance, this does not appear to be a tarball.



    好,成功运行,但是不太实用。在使它更实用之前,先看一下上面使用的 "if" 语句。语句中使用了一个布尔表达式。在 bash 中,"=" 比较运算符检查字符串是否相等。在 bash 中,所有布尔表达式都用方括号括起。但是布尔表达式实际上测试什么?让我们看一下左边。根据前面所学的字符串截断知识,"${1##*.}" 将从环境变量 "1" 包含的字符串开始部分除去最长的 "*." 匹配,并返回结果。这将返回文件中最后一个 "." 之后的所有部分。显然,如果文件以 ".tar" 结束,结果将是 "tar",条件也为真。

    您可能会想:开始处的 "1" 环境变量是什么。很简单 -- $1 是传给脚本的第一个命令行自变量,$2 是第二个,以此类推。

  • 相关阅读:
    Flex 布局
    vue学习之用 Vue.js + Vue Router 创建单页应用的几个步骤
    vue学习起步:了解下
    vue学习一:新建或打开vue项目(vue-cli2)
    adb环境变量配置
    数据类型判断和数据类型转换代码工具
    日期工具集合
    postman变量的使用和设置
    浮点数运算和金额处理
    07- Linux常用命令
  • 原文地址:https://www.cnblogs.com/kentyshang/p/814279.html
Copyright © 2020-2023  润新知