青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計

最新評論

shell中字符串處理方式

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

第一種方法:

${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}。它的確切含義是什么?基本上,在 ${ } 中輸入環(huán)境變量名稱,兩個 ##,然后是通配符 ("*fo")。然后,bash 取得 MYVAR,找到從字符串 "foodforthought.jpg" 開始處開始、且匹配通配符 "*fo" 的 最長 子字符串,然后將其從字符串的開始處截去。剛開始理解時會有些困難,為了感受一下這個特殊的 "##" 選項如何工作,讓我們一步步地看看 bash 如何完成這個擴(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 找到兩個匹配。它選擇最長的匹配,從初始字符串的開始處除去,然后返回結(jié)果。

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

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

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

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

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

在此例中,使用 "%%" 或 "%" 并不重要,因為只能有一個匹配。還要記住:如果忘記了應(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

這種形式的字符串截斷非常簡便,只需用冒號分開來指定起始字符和子字符串長度。

應(yīng)用字符串截斷

現(xiàn)在我們已經(jīng)學(xué)習(xí)了所有截斷字符串的知識,下面寫一個簡單短小的 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

要運(yùn)行此腳本,將它輸入到文件 mytar.sh 中,然后輸入 "chmod 755 mytar.sh",生成可執(zhí)行文件。然后,如下做一下 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.

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

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

2、寫進(jìn)度條時候參考過,后來考慮到成本大于使用,就放棄了
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個byte開始,取m個
cut -bn,m:以byte為單位,截取第n,m個byte
cut -b-n,m:以byte為單位,截取1-n,和第m個
-c:以charactor為單位
-d:指定分隔符,默認(rèn)為tab
-s:使標(biāo)準(zhǔn)輸入中沒有delimeter
cut -f1:截取第1個域
3、字符串截取前后部分內(nèi)容
echo ${變量#開始字符串*結(jié)束字符串} #表示掐頭,因為鍵盤上#在$($就是變量,這樣便于記住)前面,一個表示最小匹配
echo ${變量%開始字符串r*結(jié)束字符串} # %表示去尾,因為鍵盤上%在$后面,一個表示最小匹配

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

例子
isher@isher-ubuntu:~$ aa="No such file or directory" #編寫此文檔時,正好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)容,此句話中有兩個e
如果標(biāo)記一個#
isher@isher-ubuntu:~$ echo ${aa#No*e}
則結(jié)果為 or directory
isher@isher-ubuntu:~$ echo ${aa##No*e}
##的結(jié)果為 ctory
截取后部的意思相同

4、在寫腳本的時候,有一個替換的問題,特提出
echo ${變量/舊的內(nèi)容/新的內(nèi)容} #替換一個
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 #這里僅替換了第一個單詞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ù),好象只能查到第一個,第二個,第三個,...,怎么查到呢???)
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} # #表示掐頭,因為鍵盤上#在$前面,一個表示最小匹配
$echo ${variable##tartletter*endletter} 兩個表示最大匹配
$echo ${variable%startletter*endletter} # %表示去尾,因為鍵盤上%在$后面,一個表示最小匹配
$echo ${variable%%startletter*endletter} 兩個表示最大匹配

代碼:
~$ 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} #替換一個
$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 大龍 閱讀(476) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲人成亚洲人成在线观看| 在线欧美三区| 亚洲午夜在线视频| 亚洲精品久久7777| 日韩亚洲视频在线| 夜夜嗨网站十八久久| 亚洲精选一区二区| 亚洲色图综合久久| 羞羞答答国产精品www一本 | 国产精品高潮呻吟| 国产精品私人影院| 依依成人综合视频| 99re热精品| 欧美一区二区福利在线| 久久久99精品免费观看不卡| 免费成人网www| 日韩视频不卡| 久久岛国电影| 欧美色综合网| 尤物精品国产第一福利三区 | 欧美在线欧美在线| 欧美成人午夜免费视在线看片 | 一区二区三区蜜桃网| 亚洲欧美日韩区| 久久久久久自在自线| 欧美日韩亚洲91| 黄色在线一区| 性久久久久久久| 久久免费高清视频| 欧美国产日韩一区| 国产精品theporn88| 欧美午夜影院| 亚洲国产另类久久久精品极度| 日韩亚洲视频| 欧美~级网站不卡| 亚洲欧美激情四射在线日| 另类图片国产| 国产午夜精品理论片a级探花| 亚洲精品影视在线观看| 久久国产欧美精品| 在线亚洲+欧美+日本专区| 久久精品一区中文字幕| 国产精品久久久久久亚洲调教| 亚洲国产精品久久久久秋霞不卡 | 国产视频久久久久久久| 黄色国产精品一区二区三区| 亚洲美女av在线播放| 久久国产一二区| 99精品国产在热久久| 久久综合色一综合色88| 国产字幕视频一区二区| 欧美亚洲综合在线| 亚洲最快最全在线视频| 欧美大片在线看| 亚洲人成艺术| 欧美岛国激情| 免费欧美日韩国产三级电影| 国产综合色产在线精品| 欧美在线视频不卡| 亚洲欧美国产精品va在线观看| 欧美视频导航| 亚洲天堂偷拍| 一区二区三区蜜桃网| 欧美视频精品在线| 亚洲影视中文字幕| 亚洲综合视频一区| 国产一区二区三区免费在线观看| 欧美呦呦网站| 欧美在线免费视屏| 伊人春色精品| 亚洲国产日本| 欧美日韩免费观看一区二区三区| 一片黄亚洲嫩模| 99热这里只有精品8| 国产精品麻豆va在线播放| 欧美一区中文字幕| 久久久av水蜜桃| 亚洲精品一区在线| 亚洲小少妇裸体bbw| 国产精品永久在线| 美国十次成人| 欧美日韩三区四区| 午夜伦理片一区| 久久国产成人| 亚洲人www| 亚洲一区区二区| 亚洲第一福利视频| 99国产精品99久久久久久| 国产嫩草一区二区三区在线观看 | 欧美日韩国产丝袜另类| 午夜亚洲伦理| 久久免费精品视频| 日韩一区二区免费看| 亚洲手机在线| 亚洲高清视频在线| 亚洲系列中文字幕| 91久久精品国产91久久性色| 一区二区三区视频观看| 黑丝一区二区| 最新69国产成人精品视频免费| 亚洲黑丝一区二区| 国产欧美欧美| 亚洲欧洲日产国产网站| 国产欧美一区二区三区久久| 欧美国产视频一区二区| 国产精品久久久久久久久久ktv| 久久人人97超碰人人澡爱香蕉| 欧美黑人一区二区三区| 久久精品视频免费观看| 欧美精品18videos性欧美| 欧美一区二区福利在线| 欧美精品一区三区在线观看| 久久久久91| 国产精品亚发布| 亚洲三级影院| 亚洲经典视频在线观看| 久久精品99国产精品日本| 亚洲欧美区自拍先锋| 欧美精品一区三区在线观看| 蜜臀99久久精品久久久久久软件| 国产精品久久二区| 日韩一区二区电影网| 亚洲精品免费在线播放| 久久一区中文字幕| 狼狼综合久久久久综合网| 国产精品一卡二| 99亚洲一区二区| 一区二区三区高清在线 | 亚洲欧美久久久| 中文欧美字幕免费| 欧美另类专区| 91久久在线播放| 亚洲精品五月天| 免费观看一级特黄欧美大片| 久久伊人一区二区| 狠色狠色综合久久| 久久精品人人做人人爽| 久久久www成人免费毛片麻豆| 国产精品一区在线播放| 亚洲欧美日韩视频二区| 欧美诱惑福利视频| 国产亚洲成精品久久| 性欧美暴力猛交69hd| 久久综合99re88久久爱| 尤妮丝一区二区裸体视频| 久久米奇亚洲| 欧美国产日韩一区二区在线观看| 亚洲国产一二三| 欧美激情第1页| 亚洲免费播放| 亚洲免费一在线| 国产欧美一区二区三区在线看蜜臀 | 亚洲激情电影在线| 欧美激情精品久久久久久变态| 亚洲国产一区二区a毛片| 日韩亚洲不卡在线| 欧美亚一区二区| 久久大香伊蕉在人线观看热2| 久久嫩草精品久久久精品一 | 欧美一区二区高清| 久久五月天婷婷| 亚洲国产精品成人综合| 在线视频欧美精品| 国产亚洲va综合人人澡精品| 久久免费视频在线| 99成人精品| 久久久久青草大香线综合精品| 在线观看一区二区视频| 欧美美女福利视频| 久久狠狠亚洲综合| 亚洲三级毛片| 久久婷婷国产麻豆91天堂| 99成人免费视频| 国产亚洲高清视频| 欧美日本在线一区| 欧美一区二区在线看| 91久久在线观看| 久久深夜福利| 亚洲一区二区毛片| 亚洲第一区中文99精品| 国产精品成人va在线观看| 久久久国产精品一区二区三区| 亚洲激情不卡| 免费人成精品欧美精品| 亚洲一区二区免费看| 在线日韩av永久免费观看| 国产精品乱子乱xxxx| 欧美国产亚洲视频| 久久久久国产一区二区三区| 日韩视频免费在线| 亚洲夫妻自拍| 久久人人看视频| 欧美诱惑福利视频| 亚洲欧美国产精品va在线观看| 亚洲欧洲精品一区| 在线观看日韩一区| 精品成人一区二区三区四区| 国产精品视频久久久| 欧美日韩一区在线视频| 欧美成人dvd在线视频|