sed 資料流編輯器

2021-09-02 14:11:33 字數 4690 閱讀 6385

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 備份原檔案 ...