小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

shell腳本regex正則表達(dá)式 和 字符串替換

 WUCANADA 2012-04-19
shell腳本regex正則表達(dá)式 和 字符串替換
2010年11月22日 星期一 下午 10:35
任意字符
^行首匹配
$行尾匹配
^$表示空行,不含字符的行
^ $匹配只有單個(gè)空格的行
[0-9]
[a-zA-Z]
^[A- Z]搜索以大寫字母開頭的行
[^A-Z]匹配大寫字母意外的任意字符
*表示匹配0個(gè)或若干個(gè)字符,如:a*,表示匹配0個(gè)或若干個(gè)a; aa*表示匹配至少1個(gè)a
.*來(lái)表示0或若干個(gè)任意字符
e.e*表示匹配第一個(gè)e和最后一個(gè)e之間的任意字符
[-0-9]匹配一 個(gè)連字符或數(shù)字
[]a-z]匹配一個(gè)]或者字母
\{min,max\}匹配任意數(shù)目的字符串
[a-z]\{10\}只匹配10個(gè) a-z字符的字符串
s/.\{5\}$// 刪除每行的最后5個(gè)字符
\(...\),n是1到9的數(shù)字,表示存儲(chǔ)用的寄存器,用\n來(lái)引 用存在寄存器中的內(nèi)容
^\(.\)\1匹配行首的第一個(gè)字符,并將該字符存到1號(hào)寄存器中,然后匹配1號(hào)寄存器中的內(nèi)容,這由\1的描述。該正則 表達(dá)式的最終效果是,如果一行的頭兩個(gè)字符相同,就匹配他們。
^\(.\).*\1$匹配一行中的頭一個(gè)字符(^.)跟最后一個(gè)字符(\1$)相 同的行。.*匹配中間的所有內(nèi)容
^\(...\)\(...\)行中頭三個(gè)字符存在1號(hào)寄存器,接著的三個(gè)字符存在2號(hào)寄存器.
s/\(.*\) \(.*\)/\2 \1/g 交換兩個(gè)字段

.任何字符
^行首
$行尾
*前導(dǎo)的正則表達(dá)式重復(fù)0或若干次
[字 符表]字符中的任一字符
a..表示a后的2個(gè)字符
^wood表示行首的wood
x$表示行為的x
^INSERT$只包含 字符串INSERT的行
^$不包含任何字符的行
x*表示0或若干個(gè)連續(xù)的x
xx*表示1或多個(gè)連續(xù)的x
.*表示0活若干 個(gè)字符
w.*s表示以w開始,s結(jié)尾的任何字符串
[tT]小寫或大寫的t

[^字符表]表示任一不在字符表中的字符 [^0-9] [^a-zA-Z]
\{min,max\}表示前導(dǎo)的正則表達(dá)式重復(fù)只燒min次,至多max次[0-9]\{3,9\}表示3到 9個(gè)數(shù)字
\(...\)表示將小括號(hào)中匹配的字符串存儲(chǔ)到下一個(gè)寄存器中(1-9),
^\(.\)表示行中第1個(gè)字符存到1號(hào)寄存器
^\ (.\)\1表示行首戀歌字符,且他們相同

cut -c5 file把file文件中沒行的第5個(gè)字符析取出來(lái);
用逗號(hào)分割的數(shù) 值列表,如-c1,13,50把第1,13,50個(gè)字符析取出來(lái)
cut -c20-50把第20到50之間的字符析取出來(lái)

who | cut -c1-8
who | cut -c1-8,18- 析取行中的第1到8個(gè)字符(用戶名)和第18到行尾的字符(登錄時(shí)間)

cut -ddchar -ffields file其中,dchar是數(shù)據(jù)中分割各字段的分割符,fields表示要從文件file中析取出來(lái)的字段.
字 段編號(hào)從1開始,而且格式跟以前將的用來(lái)指定字符位置的數(shù)字一樣(如-f1、2、8、-f1-3、-f4-)。
cut -d: -f1 /etc/passwd
如果已知字段之間使用制表符分隔的,就可以給cut命令用-f選項(xiàng)而不用-c選項(xiàng),好多了!還記得吧,這里用不著用-d選 項(xiàng)來(lái)指定分割符,因?yàn)?br> cut把制表符默認(rèn)為分割符。

paste和cut正好相反,它不是把行分離開,而是把多行合并在一起。

paste names numbrs文件names中的每一行都和numbers中的對(duì)應(yīng)行顯示在一起,中間用制表符分割。
如果不想用制表符作默認(rèn)分割, 可以使用-dchars指定分割符
paste -d'+' names addresses numbers
-s選項(xiàng)告訴paste把同 一文件中的行粘貼在一起,而不是從其他文件。如果只指定一個(gè)文件名,其效果是把文件中的所有行合并成一行,原來(lái)隔行之間用制表符或者有-d選項(xiàng)指定的分割 符分割。

sed是用來(lái)編輯數(shù)據(jù)的程序,意指流編輯器(stream editor)。與ed不同,sed不能用于交互,
-n選 項(xiàng),然后使用p命令顯式指定
sed -n '1,2p' file只顯示前2行
sed -n '/Unix/p' file只打印包含Unix的行
刪除行
d刪除整行文件
sed '1,2d' file刪除1和2行
記住sed默認(rèn)把輸入 的所有行寫入標(biāo)準(zhǔn)輸出,所以生于行的文字,也就是從第3行到結(jié)尾,都被寫入標(biāo)準(zhǔn)輸出。
sed '5d'刪除第5行
sed '/[Tt]est/d'刪除包含test或Test的行
sed -n '20,25p' test只顯示文件test的第20行到第25行
sed '1,10s/unix/UNIX/g' intro報(bào)intro前10行中的unix改為UNIX
sed '/jan/s/-1/-5/'將所有包含jan的行中第1個(gè)-1改為-5
sed 's/...//' data刪除data文件每一行的前3個(gè)字符
sed 's/...$//' data刪除data文件每一行的最后3個(gè)字符
sed -n 'I' text顯示文件text的所有行,把所有不可打印字符顯示為\nn,制表符顯示為\t

過(guò)濾器tr用來(lái)轉(zhuǎn)換來(lái)自標(biāo)準(zhǔn)輸入的字 符,tr命令的一般格式為
tr from-chars to-chars

tr e x < intro把所有字母e轉(zhuǎn)換成x
tr命令的輸入必須重定向到文件intro,因?yàn)閠r總是從標(biāo)準(zhǔn)輸入獲得輸入;轉(zhuǎn)換的結(jié)果寫入標(biāo)準(zhǔn)輸出,而原始文 件保持不變。
cut -d: -f1,6 /etc/passwd | tr : ' ' 通過(guò)在管道線的最后加上適當(dāng)?shù)膖r命令,就可以把冒號(hào)轉(zhuǎn)換成制表符,這樣產(chǎn)生的輸出更容易看
單引號(hào)中括的是制表符(盡管你看不到)。必須將它括在 引號(hào)中,以便穿過(guò)shell,使tr有機(jī)會(huì)看到它。
使用\nnn來(lái)給tr提供8進(jìn)制表示的字符
一些ascii字符的八進(jìn)制值
響 鈴    7
退格    10
制表符 11
新行    12
換行    12
換頁(yè)    14
回 車    15
轉(zhuǎn)義    33

date | tr ' ' '\12'此例中,tr接受date命令的輸出,并把所有的空格轉(zhuǎn)換成換行
tr '[a-z]' '[A-Z]' <intro將所有小寫轉(zhuǎn)換為大寫
-s選項(xiàng),tr命令中的-s選項(xiàng)用來(lái)壓縮to-chars中重復(fù)的字符,換句話說(shuō),如果轉(zhuǎn)換完成后,有 to-chars中的某個(gè)字符連續(xù)出現(xiàn)多次,則這些連續(xù)相同的字符被替換為一個(gè)字符。
如下面的命令將冒號(hào)轉(zhuǎn)換為制表符,并將多個(gè)連續(xù)制表符替換為 單個(gè)制表符:
tr -s ':' '\11\'
tr -s ' ' ' ' <lotspaces通過(guò)-s將多個(gè)空格全部壓縮為單個(gè)空格
-d選項(xiàng)用來(lái)刪除掉輸入流中的字符,其一般格式為
tr -d from-chars任何列在from-chars中的字符都會(huì)被從標(biāo)準(zhǔn)輸入中刪除。下例用tr來(lái)刪除文件intro中的所有空格:
tr -d ' ' <intro
當(dāng)然sed 's/ //g' intro也可以得到同樣的效果

tr 'X' 'x'     把大X專成小x
tr '()' '{}'   把所有左小括號(hào)轉(zhuǎn)換成左大括號(hào),右小括號(hào)專成右大括號(hào)
tr '[a-z]' '[A-Z]' 把小寫轉(zhuǎn)大寫
tr '[A-Z]' '[N-ZA-M]' 把A-M字母分別專成N-Z把N-Z轉(zhuǎn)成A-M
tr '    ' ''把所有制表符轉(zhuǎn)換成空格
tr -s ' ' ''把多個(gè)空格轉(zhuǎn)換成單個(gè)空格
tr -d '\14' 刪除所有換頁(yè)字符(八進(jìn)制14)
tr -d '[0-9]'刪除所有數(shù)字

grep '[A-Z]' list list中包含一個(gè)大寫字母的行
grep '[0-9]' data中包含數(shù)字的行
grep '[A-Z]...[0-9]' list list中包含以大寫字母開始、數(shù)字結(jié)尾的5個(gè)字符組合的行
grep '\.pic$' filelist filelist中以.pic結(jié)尾的行


uniq in_file out_file該格式中,uniq把in_file復(fù)制到out_file,處理過(guò)程中,去掉其中的重復(fù)行。如果不指定第2個(gè)參數(shù)out_file,結(jié) 果就寫入標(biāo)準(zhǔn)輸出;如果in_file沒有指定,那么uniq就成了一個(gè)過(guò)濾器,從標(biāo)準(zhǔn)輸入讀取輸入。

>或<    重定向,覆蓋原有的內(nèi)容
>>或<< 重定向,想文件末尾追加內(nèi)容
tee     顯示在終端上的內(nèi)容存儲(chǔ)到文件 ls | tee >glx

-d 目錄
-e 存在
-f 普通文件
-r 進(jìn)程可讀文件
-s 長(zhǎng)度不為0
-w 進(jìn)程可寫文件
-x 可執(zhí)行
-L 鏈接文件


$# 傳給程序的參數(shù)個(gè)數(shù),或者執(zhí)行set命令設(shè)置的參數(shù)個(gè)數(shù)
$* 對(duì)位置參數(shù)等的集中引用
$@ 跟$*相似,區(qū)別在于當(dāng)加入雙引號(hào)后("$@"),集中引用位置參數(shù)"$1","$2"...等
$0 正執(zhí)行的程序名
$$ 正執(zhí)行程序的進(jìn)程id
$! 最后一個(gè)發(fā)生后臺(tái)運(yùn)行的程序的進(jìn)程id
$? 最后一個(gè)在前臺(tái)執(zhí)行的程序的退出狀態(tài)
$- 當(dāng)前有效選項(xiàng)標(biāo)志

`command`符號(hào)之間的內(nèi)容為需要執(zhí)行的命令
make -C /lib/modules/`uname -r`/build M=`pwd`

使用echo可以顯示字符串,但是不能格式化字符串,可以使用printf實(shí)現(xiàn)
printf "format" arg1 arg2 ...

ln -s from to 把from鏈接到to上,所以to是from的符號(hào)鏈接

tree -d只顯示目錄
tree -L 2顯示2級(jí)目錄

字符串比較
s1 = s2    s1等于s2
s1 != s2    s1不等于s2
s1          s1不為空
-n s1       s1不為空
-z s1       s1為空
整數(shù)比較操作
-eq 等于
-ge 大于或等于
-gt 大于
-le 小于或等于
-lt 小于
-ne 不等于

[ "$x1" = 5 ]字符串比較
[ "$x1" -eq 5 ]整數(shù)比較

-a 邏輯與操作
-o 邏輯或操作


command1 && command2
則先執(zhí)行command1,如果返回的退出狀態(tài) 為0,則執(zhí)行command2;如果command1返回的退出狀態(tài)非0,則跳過(guò)command2

command1 || command2
和上邊的&&差不多,只是,僅僅當(dāng)command1返回非0時(shí),才執(zhí)行command2


#!/bin/sh
append2=0
include_lib=1

if [ -f cscope_i ];then
    rm cscope_i
fi

for cscope_file in $*; do
if [ -f "$cscope_file" ] || [ -d "$cscope_file" ];then
#   if [ $cscope_file = '-a' ];then
#    append2=1
#    continue
#   fi
#
#   if [ $cscope_file = '-n' ];then
#    include_lib=0<F11>
#    continue
#   fi
   if [ "$append2" = "1" ];then
    find $cscope_file -maxdepth 1 -name '*.[cChH]' -o -name '*.[cC][pP][pP]'>>cscope_i
   else
    find $cscope_file -name '*.[cChH]' -o -name '*.[cC][pP][pP]'>>cscope_i
   fi
else
   if [ $cscope_file = '-a' ];then
    append2=1
   elif [ $cscope_file = '-n' ];then
    include_lib=0
   else
    echo "Error: cannot read file $cscope_file"
   fi
fi
done

if [ -f cscope_i ];then
    if [ "$include_lib" = "1" ];then
        cscope -bi cscope_i
    else
        cscope -bki cscope_i
    fi
    rm cscope_i
fi

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多