1. 程式人生 > >第11章:sed進階操作

第11章:sed進階操作

ssa str 插入 引號 ams 部分 情況 沒有 ims

第11章:sed進階操作

sed是一個很好的文件處理工具,本身是一個管道命令,主要是以行為單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作,下面先了解一下sed的用法

sed命令行格式為:

sed [option] ‘command’ 輸入文本

[option] 常用選項:

-n --- 使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。

-e --- 直接在指令列模式上進行 sed 的動作編輯。

-f --- 直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的sed 動作。

-r --- sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)。

-i --- 直接修改讀取的檔案內容,而不是由屏幕輸出。

‘command’ 常用命令:

a ------ 新增

c ------ 取代

d ------ 刪除

i ------ 插入

p ------ 列印

s ------ 替換

舉例:

Linux系統創建了一個測試文本list,後續部分範例會使用到list測試文本,測試文本list內容如下:

[[email protected] home]# cat list

John Daggett, 341 King Road, Plymouth MA

Alice Ford, 22 EAST Broadway, Richmond VA

Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

Terry Kalkas, 402 Lans Road, Beaver Falls PA

Eric Adams, 20 Post Road, Sudbury MA

Hubert Sims, 328A Brook Road, Roanoke VA

Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

Sal Carpenter, 73 6th Street, Boston MA

範例1’command’ 常用命令 s替換,把list文本MA字段替換成Massachusetts字段。

[[email protected] home]# sed ‘s/MA/Massachusetts/‘ list

John Daggett, 341 King Road, Plymouth Massachusetts

Alice Ford, 22 EAST Broadway, Richmond VA

Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

Terry Kalkas, 402 Lans Road, Beaver Falls PA

Eric Adams, 20 Post Road, Sudbury Massachusetts

Hubert Sims, 328A Brook Road, Roanoke VA

Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

Sal Carpenter, 73 6th Street, Boston Massachusetts

知識點補充:command’ 常用命令 s替換選項並不會影響list文本原來的內容。

範例2[option] 常用選項 -e指定命令行上的多重指令。三種方法實現多重指令。

[[email protected] home]# sed ‘s/MA/,Massachusetts/;s/PA/,Pennsylvania/‘ list

John Daggett, 341 King Road, Plymouth ,Massachusetts

Alice Ford, 22 EAST Broadway, Richmond VA

Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

Terry Kalkas, 402 Lans Road, Beaver Falls ,Pennsylvania

Eric Adams, 20 Post Road, Sudbury ,Massachusetts

Hubert Sims, 328A Brook Road, Roanoke VA

Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

Sal Carpenter, 73 6th Street, Boston ,Massachusetts

[[email protected] home]# sed -e ‘s/MA/,Massachusetts/‘ -e ‘s/PA/,Pennsylvania/‘ list

John Daggett, 341 King Road, Plymouth ,Massachusetts

Alice Ford, 22 EAST Broadway, Richmond VA

Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

Terry Kalkas, 402 Lans Road, Beaver Falls ,Pennsylvania

Eric Adams, 20 Post Road, Sudbury ,Massachusetts

Hubert Sims, 328A Brook Road, Roanoke VA

Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

Sal Carpenter, 73 6th Street, Boston ,Massachusetts

[[email protected] home]# sed ‘

> s/MA/,Massachusetts/

> s/PA/,Pennsylvania/‘ list

John Daggett, 341 King Road, Plymouth ,Massachusetts

Alice Ford, 22 EAST Broadway, Richmond VA

Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

Terry Kalkas, 402 Lans Road, Beaver Falls ,Pennsylvania

Eric Adams, 20 Post Road, Sudbury ,Massachusetts

Hubert Sims, 328A Brook Road, Roanoke VA

Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

Sal Carpenter, 73 6th Street, Boston ,Massachusetts

知識點補充:’command’並不是任何情況下都需要將指令用單引號括起來,但需要養成這個好習慣。使用單引號可以阻止shell解釋編輯指令中的特殊字符或空格。

範例3[option] 常用選項 -f直接將 sed 的動作寫在一個文本內, -f 文本則可以執行文本內的sed 動作。

[[email protected] home]# cat filename

s/MA/,Massachusetts/

s/PA/,Pennsylvania/

s/CA/,California/

[[email protected] home]# sed -f filename list

John Daggett, 341 King Road, Plymouth ,Massachusetts

Alice Ford, 22 EAST Broadway, Richmond VA

Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

Terry Kalkas, 402 Lans Road, Beaver Falls ,Pennsylvania

Eric Adams, 20 Post Road, Sudbury ,Massachusetts

Hubert Sims, 328A Brook Road, Roanoke VA

Amy Wilde, 334 Bayshore Pkwy, Mountain View ,California

Sal Carpenter, 73 6th Street, Boston ,Massachusetts

知識點補充:再次提醒,顯示屏幕上的結果只是臨時的,原文本list並沒有發生改變。

範例4[option] 常用選項 –n只打印經過sed 特殊處理的那一行(或者動作)才會被列出來,通常與’command’ 常用命令p打印出某個選擇的資料。

[[email protected] home]# sed -n ‘s/MA/Massachusetts/p‘ list

John Daggett, 341 King Road, Plymouth Massachusetts

Eric Adams, 20 Post Road, Sudbury Massachusetts

Sal Carpenter, 73 6th Street, Boston Massachusetts

[[email protected] home]# cat -n list | sed - n ‘4p‘

4 Terry Kalkas, 402 Lans Road, Beaver Falls PA

[[email protected] home]# cat -n list | sed -n ‘1,4p‘

1 John Daggett, 341 King Road, Plymouth MA

2 Alice Ford, 22 EAST Broadway, Richmond VA

3 Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

4 Terry Kalkas, 402 Lans Road, Beaver Falls PA

[[email protected] home]# cat -n list | sed -n ‘1p;4p‘

1 John Daggett, 341 King Road, Plymouth MA

4 Terry Kalkas, 402 Lans Road, Beaver Falls PA

知識點補充:2,$p打印第二行到最後一行,$p打印最後一行

範例5’command’ 常用命令d刪除指定行

[[email protected] home]# cat -n list | sed ‘4d‘

1 John Daggett, 341 King Road, Plymouth MA

2 Alice Ford, 22 EAST Broadway, Richmond VA

3 Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

5 Eric Adams, 20 Post Road, Sudbury MA

6 Hubert Sims, 328A Brook Road, Roanoke VA

7 Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

8 Sal Carpenter, 73 6th Street, Boston MA

[[email protected] home]# cat -n list | sed ‘1,4d‘

5 Eric Adams, 20 Post Road, Sudbury MA

6 Hubert Sims, 328A Brook Road, Roanoke VA

7 Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

8 Sal Carpenter, 73 6th Street, Boston MA

[[email protected] home]# cat -n list | sed ‘1d;4d;8d‘

2 Alice Ford, 22 EAST Broadway, Richmond VA

3 Orville Thomas, 11345 Oak Bridge Road, Tulsa OK

5 Eric Adams, 20 Post Road, Sudbury MA

6 Hubert Sims, 328A Brook Road, Roanoke VA

7 Amy Wilde, 334 Bayshore Pkwy, Mountain View CA

知識點補充: $d刪除最後一行,/^$/d刪除空行,50,$d刪除從50行到最後一行,

第11章:sed進階操作