#[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