• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評論

            shell中字符串處理方式

            象專業(yè)人員那樣截?cái)嘧址?/span>
            盡管 basename 和 dirname 是很好的工具,但有時(shí)可能需要執(zhí)行更高級的字符串“截?cái)?#8221;,而不只是標(biāo)準(zhǔn)的路徑名操作。當(dāng)需要更強(qiáng)的說服力時(shí),可以利用 bash 內(nèi)置的變量擴(kuò)展功能。已經(jīng)使用了類似于 ${MYVAR} 的標(biāo)準(zhǔn)類型的變量擴(kuò)展。但是 bash 自身也可以執(zhí)行一些便利的字符串截?cái)唷?匆幌逻@些例子:

            第一種方法:

            ${varible##*string} 從左向右截取最后一個(gè)string后的字符串

            ${varible#*string}從左向右截取第一個(gè)string后的字符串

            ${varible%%string*}從右向左截取最后一個(gè)string后的字符串

            ${varible%string*}從右向左截取第一個(gè)string后的字符串

            "*"只是一個(gè)通配符可以不要
            $ MYVAR=foodforthought.jpg
            $ echo ${MYVAR##*fo}
            rthought.jpg
            $ echo ${MYVAR#*fo}
            odforthought.jpg
            在 第一個(gè)例子中,輸入了 ${MYVAR##*fo}。它的確切含義是什么?基本上,在 ${ } 中輸入環(huán)境變量名稱,兩個(gè) ##,然后是通配符 ("*fo")。然后,bash 取得 MYVAR,找到從字符串 "foodforthought.jpg" 開始處開始、且匹配通配符 "*fo" 的 最長 子字符串,然后將其從字符串的開始處截去。剛開始理解時(shí)會(huì)有些困難,為了感受一下這個(gè)特殊的 "##" 選項(xiàng)如何工作,讓我們一步步地看看 bash 如何完成這個(gè)擴(kuò)展。首先,它從 "foodforthought.jpg" 的開始處搜索與 "*fo" 通配符匹配的子字符串。以下是檢查到的子字符串:   
            fo      MATCHES *fo
            foo
            food
            foodf      
            foodfo      MATCHES *fo
            foodfor
            foodfort   
            foodforth
            foodfortho  
            foodforthou
            foodforthoug
            foodforthought
            foodforthought.j
            foodforthought.jp
            foodforthought.jpg
            在搜索了匹配的字符串之后,可以看到 bash 找到兩個(gè)匹配。它選擇最長的匹配,從初始字符串的開始處除去,然后返回結(jié)果。

            上 面所示的第二個(gè)變量擴(kuò)展形式看起來與第一個(gè)相同,但是它只使用一個(gè) "#" -- 并且 bash 執(zhí)行 幾乎同樣的過程。它查看與第一個(gè)例子相同的子字符串系列,但是 bash 從初始字符串除去 最短 的匹配,然后返回結(jié)果。所以,一查到 "fo" 子字符串,它就從字符串中除去 "fo",然后返回 "odforthought.jpg"。

            這樣說可能會(huì)令人十分困惑,下面以一簡單方 式記住這個(gè)功能。當(dāng)搜索最長匹配時(shí),使用 ##(因?yàn)?## 比 # 長)。當(dāng)搜索最短匹配時(shí),使用 #。看,不難記吧!等一下,怎樣記住應(yīng)該使用 '#' 字符來從字符串開始部分除去?很簡單!注意到了嗎:在美國鍵盤上,shift-4 是 "$",它是 bash 變量擴(kuò)展字符。在鍵盤上,緊靠 "$" 左邊的是 "#"。這樣,可以看到:"#" 位于 "$" 的“開始處”,因此(根據(jù)我們的記憶法),"#" 從字符串的開始處除去字符。您可能要問:如何從字符串末尾除去字符。如果猜到我們使用美國鍵盤上緊靠 "$" 右邊 的字符 ("%),那就猜對了。這里有一些簡單的例子,解釋如何截去字符串的末尾部分:

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

            正如您所見,除了將匹配通配符從字符串末尾除去之外,% 和 %% 變量擴(kuò)展選項(xiàng)與 # 和 ## 的工作方式相同。請注意:如果要從末尾除去特定子字符串,不必使用 "*" 字符:

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

            在此例中,使用 "%%" 或 "%" 并不重要,因?yàn)橹荒苡幸粋€(gè)匹配。還要記住:如果忘記了應(yīng)該使用 "#" 還是 "%",則看一下鍵盤上的 3、4 和 5 鍵,然后猜出來。

            第二種方法:${varible:n1:n2}:截取變量varible從n1到n2之間的字符串。

            可以根據(jù)特定字符偏移和長度,使用另一種形式的變量擴(kuò)展,來選擇特定子字符串。試著在 bash 中輸入以下行:

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

            這種形式的字符串截?cái)喾浅:啽悖恍栌妹疤?hào)分開來指定起始字符和子字符串長度。

            應(yīng)用字符串截?cái)?/span>

            現(xiàn)在我們已經(jīng)學(xué)習(xí)了所有截?cái)嘧址闹R(shí),下面寫一個(gè)簡單短小的 shell 腳本。我們的腳本將接受一個(gè)文件作為自變量,然后打印:該文件是否是一個(gè) tar 文件。要確定它是否是 tar 文件,將在文件末尾查找模式 ".tar"。如下所示:

            mytar.sh -- 一個(gè)簡單的腳本

            #!/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

            要運(yùn)行此腳本,將它輸入到文件 mytar.sh 中,然后輸入 "chmod 755 mytar.sh",生成可執(zhí)行文件。然后,如下做一下 tar 文件試驗(yàn):

            $ ./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.

            好, 成功運(yùn)行,但是不太實(shí)用。在使它更實(shí)用之前,先看一下上面使用的 "if" 語句。語句中使用了一個(gè)布爾表達(dá)式。在 bash 中,"=" 比較運(yùn)算符檢查字符串是否相等。在 bash 中,所有布爾表達(dá)式都用方括號(hào)括起。但是布爾表達(dá)式實(shí)際上測試什么?讓我們看一下左邊。根據(jù)前面所學(xué)的字符串截?cái)嘀R(shí),"${1##*.}" 將從環(huán)境變量 "1" 包含的字符串開始部分除去最長的 "*." 匹配,并返回結(jié)果。這將返回文件中最后一個(gè) "." 之后的所有部分。顯然,如果文件以 ".tar" 結(jié)束,結(jié)果將是 "tar",條件也為真。

            您可能會(huì)想:開始處的 "1" 環(huán)境變量是什么。很簡單 -- $1 是傳給腳本的第一個(gè)命令行自變量,$2 是第二個(gè),以此類推。
            1、
            我用在判斷apache安裝版本的時(shí)候用的
            isher@isher-ubuntu:~$ aa=apache_2.0.59
            isher@isher-ubuntu:~$ echo $aa | awk -F_ '{ print $1; }' #F后面的下劃線分割成了apache和2.0.59兩個(gè)變量 $1即第一個(gè)

            2、寫進(jìn)度條時(shí)候參考過,后來考慮到成本大于使用,就放棄了
            isher@isher-ubuntu:~$ a=12345678
            isher@isher-ubuntu:~$ echo $a|cut -b 2-5
            isher@isher-ubuntu:~$ 2345 #這里是輸出結(jié)果

            cut:對標(biāo)準(zhǔn)輸入的字符串進(jìn)行處理
            cut -bn-m:以byte為單位,從第n個(gè)byte開始,取m個(gè)
            cut -bn,m:以byte為單位,截取第n,m個(gè)byte
            cut -b-n,m:以byte為單位,截取1-n,和第m個(gè)
            -c:以charactor為單位
            -d:指定分隔符,默認(rèn)為tab
            -s:使標(biāo)準(zhǔn)輸入中沒有delimeter
            cut -f1:截取第1個(gè)域
            3、字符串截取前后部分內(nèi)容
            echo ${變量#開始字符串*結(jié)束字符串} #表示掐頭,因?yàn)殒I盤上#在$($就是變量,這樣便于記住)前面,一個(gè)表示最小匹配
            echo ${變量%開始字符串r*結(jié)束字符串} # %表示去尾,因?yàn)殒I盤上%在$后面,一個(gè)表示最小匹配

            echo ${變量##開始字符串*結(jié)束字符串} 兩個(gè)表示最大匹配
            echo ${變量%%開始字符串r*結(jié)束字符串} 兩個(gè)表示最大匹配
            總結(jié)記憶方法
            鍵盤上#$%三個(gè)字符連續(xù)的,以$為變量提示符,#即截取變量前的字符,表示截取后面字符

            例子
            isher@isher-ubuntu:~$ aa="No such file or directory" #編寫此文檔時(shí),正好shell開著,提示這行話~ *_^
            isher@isher-ubuntu:~$ echo ${aa#No*dir}
            ectory # 這里就是輸出結(jié)果,將No such file or directory 之間的都刪除了,得到就是ectory
            截取后部的意思相同

            isher在簡單說一下##的意思
            isher@isher-ubuntu:~$ aa="No such file or directory" #截取e之后的內(nèi)容,此句話中有兩個(gè)e
            如果標(biāo)記一個(gè)#
            isher@isher-ubuntu:~$ echo ${aa#No*e}
            則結(jié)果為 or directory
            isher@isher-ubuntu:~$ echo ${aa##No*e}
            ##的結(jié)果為 ctory
            截取后部的意思相同

            4、在寫腳本的時(shí)候,有一個(gè)替換的問題,特提出
            echo ${變量/舊的內(nèi)容/新的內(nèi)容} #替換一個(gè)
            echo ${變量//舊的內(nèi)容/新的內(nèi)容} #替換所有

            例子:
            isher@isher-ubuntu:~$ aa="No such file or directory"
            isher@isher-ubuntu:~$ echo ${aa/o/a}
            Na such file or directory #這里僅替換了第一個(gè)單詞No的o變?yōu)榱薬

            isher@isher-ubuntu:~$ aa="No such file or directory"
            isher@isher-ubuntu:~$ echo ${aa//o/a}
            Na such file ar directary #這里可以看到,替換這句話(變量)的所有的o為了a了

            1.得到字符串長度
            方法一:
            $echo ${#variable}

            代碼:
            ~$ x="this is a test"
            ~$ echo ${#x}
            14
            方法二:
            $expr length "$variable"

            代碼:
            ~$ x="this is a test"
            ~$ expr length "$x"
            14
            方法三:
            $expr "$variable" : ".*"
            code:
            代碼:
            ~$ x="this is a test"
            ~$ expr "$x" : ".*"
            14
            2.查找字符串子串位置
            方法:
            $expr index "$variable" "substring"
            code:
            代碼:
            ~$ x="this is a test"
            ~$ expr index "$x" "is"
            3
            ~$ expr index "$x" "t"
            1
            (ps:如果出現(xiàn)重復(fù),好象只能查到第一個(gè),第二個(gè),第三個(gè),...,怎么查到呢???)
            3.得到字符串子字符串
            方法一:
            $echo ${variable:position:length}

            代碼:
            ~$ x="this is a test"
            ~$ echo ${x:1:5}
            his i
            方法二:
            $expr substr "$variable" startposition length
            代碼:
            ~$ x="this is a test"
            ~$ expr substr "$x" 1 5
            this
            (ps:注意方法一和方法二中位置的區(qū)別!)
            4.匹配正則表達(dá)式之匹配長度
            方法:
            $expr match "$x" "string"

            代碼:
            ~$ x="this is a test"
            ~$ expr match "$x" "his"
            0
            ~$ expr match "$x" "this"
            4
            ~$ expr match "$x" "."
            1
            5.字符串的掐頭去尾
            方法:
            $echo ${variable#startletter*endletter} # #表示掐頭,因?yàn)殒I盤上#在$前面,一個(gè)表示最小匹配
            $echo ${variable##tartletter*endletter} 兩個(gè)表示最大匹配
            $echo ${variable%startletter*endletter} # %表示去尾,因?yàn)殒I盤上%在$后面,一個(gè)表示最小匹配
            $echo ${variable%%startletter*endletter} 兩個(gè)表示最大匹配

            代碼:
            ~$ x="this is a test"
            ~$ echo ${x#t}
            his is a test
            ~$ echo ${x#t*h}
            is is a test
            ~$ echo ${x#t*s}
            is a test

            ~$ echo ${x##t*s}
            t

            ~$ echo ${x%t}
            this is a tes
            ~$ echo ${x%s*t}
            this is a te
            ~$ echo ${x%e*t}
            this is a t

            ~$ echo ${x%%i*t}
            th

            6.字符(串)的替換
            方法:
            $echo ${variable/oldletter/newletter} #替換一個(gè)
            $echo ${variable//oldletter/newletter} #替換所有

            代碼:
            ~$ x="this is a test"
            ~$ echo ${x/i/m}
            thms is a test
            ~$ echo ${x//i/m}

            posted on 2010-10-12 19:42 大龍 閱讀(473) 評論(0)  編輯 收藏 引用

            99久久精品毛片免费播放| 伊人久久一区二区三区无码| 99久久久国产精品免费无卡顿| 久久99精品久久久久久久不卡 | 亚洲乱码中文字幕久久孕妇黑人| 久久无码中文字幕东京热| 久久免费的精品国产V∧| 亚洲一区二区三区日本久久九| 久久精品夜色噜噜亚洲A∨| 亚洲精品无码久久久影院相关影片| 国产精品久久久久久久| 伊人精品久久久久7777| 99国产精品久久| 99蜜桃臀久久久欧美精品网站| 97超级碰碰碰碰久久久久| 欧美精品乱码99久久蜜桃| 2020最新久久久视精品爱| 久久水蜜桃亚洲av无码精品麻豆| 久久国产香蕉一区精品| 久久九九亚洲精品| 四虎国产精品免费久久5151| 99久久这里只精品国产免费 | 91精品国产综合久久婷婷| 一本久久免费视频| 国产亚洲精午夜久久久久久| 99久久精品毛片免费播放| 久久久一本精品99久久精品88| 精品久久亚洲中文无码| 色综合合久久天天给综看| 精品久久久久一区二区三区| 伊人久久综在合线亚洲2019 | 精品国产99久久久久久麻豆| 国产免费久久精品99久久| 色综合久久久久网| 青青青国产精品国产精品久久久久| 日韩精品久久久肉伦网站| 一本色道久久综合狠狠躁篇| 久久国产亚洲精品| 一本色道久久88—综合亚洲精品| 久久久久亚洲av综合波多野结衣 | 亚洲日韩欧美一区久久久久我|