sed的功能同awk類似,差別在於:sed簡單,對列處理的功能要差一些,awk的功能複雜,對列處理的功能比較強大。
只能操作ascii碼,逐行將內容讀取到記憶體中,做處理,並將處理結果輸出。這段記憶體空間被稱為「模式空間」。不一定每一行都處理,根據一定的模式匹配某些行進行處理。預設不修改原始檔,僅對模式空間資料進行處理,然後將模式空間的內容輸出。
常用選項
選項-n :靜默模式,只顯示匹配到的行
檔案test1裡的內容是:
!#/bin/bash
echo $1
echo $2
echo $3
echo $4
echo "hello"
例1
[root@localhost ~]# sed "1,3p" -n test1 //列印匹配到的第一到第三行
!#/bin/bash
echo $1
echo $2
例2[root@localhost ~]# sed '/a/p' -n test1 //列印包含字母a的行
!#/bin/bash
選項-i :編輯原始檔
sed缺省會把輸入行讀取到模式空間,簡單理解就是乙個記憶體緩衝區,sed子命令處理的內容是模式空間中的內容,而非直接處理檔案內容。因此在sed修改模式空間內容之後,並非直接寫入修改輸入檔案,而是列印輸出到標準輸出。如果需要修改輸入檔案,那麼就可以指定-i選項。
例1
[root@localhost ~]# sed -i 's/echo/hello/' test1
[root@localhost ~]# cat test1
!#/bin/bash
hello $1
hello $2
hello $3
hello $4
hello "hello"
例2[root@localhost ~]# sed -i.bak 's/echo/hello/' test1
[root@localhost ~]# cat test1.bak
!#/bin/bash
hello $1
hello $2
hello $3
hello $4
hello "hello"
//把修改內容儲存到test.bak,同時會以file.txt.bak檔案備份原來未修改檔案內容,以確保原始檔案內容安全性,防止錯誤操作而無法恢復原來內容。
選項-r :sed命令的匹配模式預設只能支援基本正規表示式,如果需要支援擴充套件正規表示式,那麼需要新增-r選項。
例
[root@localhost ~]# echo "hey huahua" | sed -r 's/(h)|(u)/w/g'
wey wwawwa
//把h或者u替換為w,g表示全域性替換
選項-f :子命令較多時,可以把命令寫入檔案中
例
[root@localhost ~]# cat sed.sh
s/hello/a/
s/world/b/
[root@localhost ~]# echo "hello huahua" | sed -f sed.sh
a huahua
sed命令
d: 刪除符合條件的行
p: 顯示符合條件的行
[root@localhost ~]# sed '/^root/,/bash$/p' -n /etc/passwd
//表示以root開頭,以bash結尾
a: a \string 在指定的行後追加新行
例
[root@localhost ~]# sed '/^hello/a \huahua~' test1 //反斜槓相當於換行符
!#/bin/bash
hello $1
huahua~
hello $2
huahua~
hello $3
huahua~
hello $4
huahua~
hello "hello"
huahua~
i: i \string 在執行的行前面插入新行
例1
[root@localhost ~]# sed '/^hello/i \huahua~' test1 //在前面追加一行
!#/bin/bash
huahua~
hello $1
huahua~
hello $2
huahua~
hello $3
huahua~
hello $4
huahua~
hello "hello"
例2[root@localhost ~]# sed '/^hello/i \huahua~\naaa' test1 //在前面追加兩行
!#/bin/bash
huahua~
aaahello $1
huahua~
aaahello $2
huahua~
aaahello $3
huahua~
aaahello $4
huahua~
aaahello "hello"
r: r filename 將制定檔案的內容,追加到匹配到行之後
例
[root@localhost ~]# cat haha
a b c
[root@localhost ~]# sed '/^hello/r ./haha' test1
!#/bin/bash
hello $1
a b c
hello $2
a b c
hello $3
a b c
hello $4
a b c
hello "hello"
a b c
//在匹配到的行後面讀檔案
w: w filename 將指定檔案的內容,另存為新的檔案(覆蓋)
例
[root@localhost ~]# sed '/^hello/w /haha' test1
!#/bin/bash
hello $1
hello $2
hello $3
hello $4
hello "hello"
[root@localhost ~]# cat /haha
hello $1
hello $2
hello $3
hello $4
hello "hello"
s: 查詢並替換 s/匹配模式/要替換的內容/
例
[root@localhost ~]# sed 's/hello/huahua/' test1
!#/bin/bash
huahua $1
huahua $2
huahua $3
huahua $4
huahua "hello"
[root@localhost ~]# sed '1,3s/hello/huahua/' test1 //指定區間
!#/bin/bash
huahua $1
huahua $2
hello $3
hello $4
hello "hello"
[root@localhost ~]# sed 's/hello/huahua/g' test1 //全域性替換
!#/bin/bash
huahua $1
huahua $2
huahua $3
huahua $4
huahua "huahua"
[root@localhost ~]# sed 's/hello/huahua/gi' test1 //忽略大小寫
&:(向後引用)表示引用匹配到的整個字串
例
[root@localhost ~]# cat ap
love
like
flove
f like
[root@localhost ~]# sed 's/l.*e/&x/g' ap
lovex
likex
flovex
f likex
// 先匹配(/總內容/)、再分組,從左往右,從外到裡
[root@localhost ~]# sed 's/\(f\)\(l.*e\)/\1x\2y/g' ap
love
like
fxlovey
f like
注意:grep和sed的對比
grep -a 2 root /etc/passwd 顯示匹配到行和後兩行
sed '2,+1p' /etc/passwd 可以看到後面的行
grep -b 2 root /etc/passwd 顯示匹配到行和前兩行
sed '2,-1p' /etc/passwd 不能用,不能檢視前一行,因為按行匹配,不回頭。
sed流編輯器
sed預設不編輯原始檔,僅對模式空間中的資料做處理 而後,處理結束後,將模式空間中的內容列印至螢幕。sed options addresscommand file.用行,和命令一起來操作文字 options n 靜默顯示,不再顯示模式空間中的內容 i 直接修改原檔案 e 指令碼 e指令碼 可以同時執...
sed 流編輯器
sed 模式空間 預設不編輯原檔案,僅對模式空間中的資料做處理 而後,處理結束後,將模式空間列印至螢幕 sed options addresscommand file n 靜默模式,不再預設顯示模式空間中的內容 i 直接修改原檔案 e script e script 可以同時執行多個指令碼 f pa...
sed(流編輯器)詳解
行編輯器 全屏編輯器 vi sed 模式空間 預設不編輯原檔案,僅對模式空間中的資料做處理 而後,處理結束後,將模式空間列印至螢幕。sed options addresscommand file options n 靜默模式,不再預設顯示模式空間中的內容 i 直接修改原檔案 i.bak 備份原檔案 ...