關於sed替換的一點自我體會(轉載)

www.lupaworld.com/bbs/viewthread.php
################################################################
#[0]:  基礎                                                                                            #
################################################################
**sed執行過程:
   a. 如果已到達文件尾,goto e;否則,用當前行內容替換模式空間的內容(即緩衝區,還有一個緩衝區:後備空間);
   b. 執行命令序列,命令只對模式空間有效;
   c. 當前行號加1
   d. goto a;
   e. 退出
注: 當前行號可由命令N或n更改,當前行號最初爲第1行
    執行命令時,如果該命令有地址前綴,那麼看*當前行號*是否與地址前綴相符,相符則執行,否則不執行
例子:
$sed -e 'p;p;i /
my-inserted-text
p;
a /
my-appended-text
p;' filename
這個例子中有6條命令:4個p命令,1個i命令,1個a命令;
$sed -e '2p;3,5p;6~10i /
my-inserted-text
p;
7a /
my-appended-text
/AA/p;' filename
這個例子類似上個,僅加入了地址前綴
((詳情請參考下文))
**常用方法:
命令:
sed 'commands' targetfile
echo "string" |sed 'commands'
腳本:
#!/bin/sed -f
command1
command2
...
**選項:
-V
--version
          提示版本信息
-h
--help
          提示幫助信息
-n
--quite
--silent
          默認情形,sed在執行完用戶提交的命令列表後,會執行p命令,這3個選項能屏蔽這個默認功能
-e
--exception=scrīpt
          增加scrīpt命令列表到當前命令列表
-f
--file=scrīpt-file
          增加scrīpt-file文件內的命令列表到當前命令列表
初始時,當前命令列表爲空;如果沒有-e,--exception,-f,--file選項,那麼命令行的第一個非選項參數被
當作命令列表添加到當前命令列表中

**常見命令:
可帶範圍地址前綴的命令(11個):
d         刪除模式空間的內容,goto c
D         刪除模式空間內的第一行,如果模式空間內還有內容,goto b,否則,goto c
p         將模式空間中的內容輸出到標準輸出
P         將模式空間中的第一行內容輸出到標準輸出
N         讀入下一行,將其*追加*到模式空間尾,當前行號加1,如果沒有可讀的行了,goto e
n         讀入下一行,用它*替換*模式空間內容,當前行好加1,如果沒有可讀的行了,goto e
h         用模式空間內容*替換*後備空間內容
H         將模式空鍵內容*追加*到後備空間尾
g/G       同h/H,但方向相反,後備空間->模式空間
x         交換模式空間和後備空間內容
l         輸出模式空間內容到標準輸出,以更人性話的方式輸出
          例子:
          $echo -ne "AA BBBB/nCCCDDDD/nFDSAFDSA/n"|sed -n 'l'
          AA BBBB$
          CCCDDDD$
          FDSAFDSA$
{         命令塊的開始,以 } 結束
b label   跳轉到標籤label處,如同c語言的goto語句
t label   從最近一次從標準輸入讀入一行開始 到 現在,如果執行了替換命令,且替換成功了,
          那麼跳轉到label處,繼續執行;否則執行下一條命令.
          相當於條件跳轉
s/regexp/replacement/
          對模式空間內容進行替換,只替換與regexp匹配的部分;
          只對第一次匹配的進行替換
s/regexp/replacement/g
          對模式空間內容          對模式空間內容進行全局替換
y/source/dest/
          逐個字符替換,其中source的長度必須與dest相等
          如:source爲ABC,dest爲abc,那麼模式空間內的所有A字符被換成a,B換成b,C換成c
          以最後一對替換爲標準,
          如:source爲ABA,dest爲abc,那麼模式空間內的所有A字符被換成c(而不是a),B換成b
          例子:
          $echo ABCD |sed -n 'y/ABA/abc/;p'
          cbCD
w file    把模式空間的內容寫到file文件內
          sed在它開始執行前,如果在當前命令序列中發現了這條命令,先將文件file清空(如果存在的話;不存在則創建),
          之後所有的寫入都是被追加到文件file尾
不帶地址前綴的命令(3個):
#comments 註釋
: label   設置標籤
}         與}匹配
最多能帶一個地址的命令(5個):
=         輸出當前行號到標準輸出
a /
text      執行完所有命令後,輸出text到標準輸出
i /
text      輸出text到標準輸出
q         如果沒有 -n 選項,則goto e;否則,先輸出模式空間內容到標準輸出,然後goto e;
r file    file表示一個文件,如果這是最後一條命令,則輸出文件file的內容到標準輸出,然後goto c;
          否則,goto c;
**地址格式(數字代表行號,從1開始):
例子:
單地址:   1   第一行
          /string/   與string匹配的行
          $   最後一行
範圍地址: 單地址,單地址
          例子:
          1,2     或     1~2
          1,$  所有行
多行:     /regexp/      代表與正則表達式regexp匹配的行
          /cregexpc     代表與正則表達式regexp匹配的行,其中c可爲任意字符
**帶地址前綴的命令:
例子:
1p
1,3p    或     1~3p
################################################################
#[1]:  元字符 * + ? { } ( )  < >                                                                   #
################################################################
* 在當前模式內*前有匹配字符時,表示個數(>=0個);
例子:
$echo 'aaabbbbcdddd' |sed 's//(a*/)/|/1|/'
|aaa|bbbbcdddd
* 在當前模式內*前無匹配字符時,表示字符'*';
例子:
$echo 'a*abbbbcdddd' |sed 's/a/(*/)/|/1|/'
|*|abbbbcdddd
$echo 'a*abbbbcdddd' |sed 's/*/|z|/'
a|z|abbbbcdddd
/* 表示字符'*';
例子:
$echo 'a*abbbbcdddd' |sed 's//(a/*/)/|/1|/'
|a*|abbbbcdddd
? 表示字符'?';
例子:
$echo 'a?abbbbcdddd' |sed 's/?/|z|/'
a|z|abbbbcdddd
/? 在當前模式內?前有匹配字符時,表示個數(0或者1個);
例子:
$echo 'aa?bbbbcdddd' |sed 's//(a/?/)/|/1|/'
|a|a?bbbbcdddd
/? 在當前模式內?前無匹配字符時,表示字符'?';
例子:
$echo 'aa?bbbbcdddd' |sed 's//(/?/)/|/1|/'
aa|?|bbbbcdddd
+ /+ 的意義類似 ? /?,只不過表示數字時爲>=1個
{ 表示字符'{'
} 表示字符'}'
/{ /} 用於表示出現次數,出現/{時,必須出現/}.
單個/}出現時,表示字符'}'
例子:
$echo '({(aabbb}d' |sed 's/b/{1,/}/}/|z|/'
({(aa|z|d
成對/{ /}的3種格式: /{1/}   /{1,/}   /{1,9/}, 如上例
( 表示字符'('
) 表示字符')'
/( /) 必須成對出現,表示子模式
例子:
$echo 'a*abbbbcdddd' |sed 's//(a/*/)/|/1|/'
|a*|abbbbcdddd
/< /> 表示完全匹配一個單詞
[zleil@ZLEIL shApp]$ echo "abc" | sed '/b/s//<ab/>/AB/g'
abc
[zleil@ZLEIL shApp]$ echo "ab c" | sed '/b/s//<ab/>/AB/g'
AB c
< > 表示普通字符 < >
**關於label的例子
這有幾個關於label的例子,
[zleil@ZLEIL shApp]$ echo "aBBbc" | sed -n 'p;b label;p;:label;p';
aBBbc
aBBbc
[zleil@ZLEIL shApp]$ echo "aBBbc" | sed -n 's/B/k/;t label;p;:label;p';
akBbc
[zleil@ZLEIL shApp]$ echo "aBBbc" | sed -n 's/D/k/;t label;p;:label;p';
aBBbc
aBBbc
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章