天天看點

SED指令詳解

1. SED簡介  

sed 是一種線上編輯器,它一次處理一行内容。處理時,把目前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接着用sed指令處理緩沖區中的内容,處理完成後,把緩沖區的内容送往螢幕。接着處理下一行,這樣不斷重複,直到檔案末尾。檔案内容并沒有 改變,除非你使用重定向存儲輸出或者配合編輯選項使用。Sed主要用來自動編輯一個或多個檔案;簡化對檔案的反複操作;編寫轉換程式等。以下介紹的是Gnu版本的Sed 3.02。 

2.SED工作模式

讀取一行内容——>編輯此行内容——>輸出編輯後的結果,并清空模式空間——>讀取下一行内容

3.用法:sed OPTIONS... [SCRIPT] [INPUTFILE...]

-r: 使用擴充的正規表達式; 

例如:# sed -n -r '/^(dev|tmp)/p' /tmp/fstab.txt

-n, --quiet, --silent: 不輸出模式空間的内容;【即:隻是輸出被比對到的内容】

例如:# sed -n '1,3p' /etc/fstab

      # sed -n '1,3d' /etc/fstab

-i:直接編輯原檔案;

例如:# sed -i '3,7d' /tmp/fstab.txt

-e: -e '' -e '' -e ''

'CMD1;CMD2;CMD3'

例如:# sed -e 's/UUID/uuid/g' -e 's/proc/PROC/g' /tmp/fstab.txt

-f /path/to/sed_script:從指定的檔案讀取處理腳本

例如:

# vim sed.script

s/UUID/uuid/g

s/proc/PROC/g

3d

# sed -f sed.script /tmp/fstab.txt

4.位址定界:

可以通過定址來定位你所希望編輯的行,該位址用數字構成,用逗号分隔的兩個行數表示以這兩行為起止的行的範圍(包括行數表示的那兩行)。如1,3表示1,2,3行,美元符号($)表示最後一行。範圍可以通過資料,正規表達式或者二者結合的方式确定 。

具體用法如下:

#: 指定行

例如:# sed '10d' /etc/fstab

驗證對比:# cat -n /etc/fstab

$: 最後一行

例如:# sed '$d' /etc/fstab

/regexp/:任何能夠被regexp比對到的行

例如:删除以#開頭的行:# sed  '/^#/d'  /etc/fstab

\%regexp%: 任何能夠被regexp比對到的行;換用%為邊界符号;

例如:# sed '/^\/dev\/mapper/d' /etc/fstab

      或# sed '\@^/dev/mapper/@d' /etc/fstab

      或# sed '\%^/dev/mapper/%d' /etc/fstab

/regexp/I

\%regexp%I:比對時忽略字元大小寫;

addr1, addr2: 指定範圍内的所有行:

0,/regexp/

#,#

/regexp/,/regexp/

#,+#

first~step:指定起始位置,以及步長

5.基本正規表達式元字元:

字元:.  []  [^]

次數:*, \+, \?, \{i,j\}

分組:\(\)

錨定:^, $, \<, \>

或者:\|

後向引用:\1, \2, ...

6.編輯指令:

注意:指令之前可以使用!表示取反操作;

=: 顯示行号【被比對到的行的行号】

# sed -n '\%/dev/mapper%=' /etc/fstab

# sed -n '\/^[[:upper:]]/=' /etc/fstab

d: 删除比對到的行;

p: 列印模式空間中的内容;

例如:# sed '1,3p' /etc/fstab    【1-3行會重複;因為預設1-3列印一次,加上p指令,再次列印,是以會重複】

通常與-n選項一同使用;

# sed -n '1,3p' /etc/fstab

a \text: append,

a \text1\ntext2\ntext3: 附加多行文本

例如:# sed '/^[[:upper:]]/a \# Upper letters' /etc/fstab

# sed '/^[[:upper:]]/a \# Upper letters\n# test text' /etc/fstab

i \text:insert, 

i \text1\ntext2: 插入多行文本 【插入到比對到的行之前】

例如:# sed '/^[[:upper:]]/i \# Upper letters\n# test text' /etc/fstab

c \text: change,把比對到的行替換為給定的文本

例如:# sed '3c \substitue text' /etc/fstab 

s///: 替換指令

# sed 's\UUID\uuid\' /etc/fstab

g: 全局替換

i: 不區分大小寫

p: 如果成功替換則列印

w /path/to/somefile: 将替換後的結果儲存至指定檔案中

例如:# sed 's/tmpfs/TMPFS/gw /tmp/sed.txt' /etc/fstab

      # cat /tmp/sed.txt

w /path/to/somefile:将比對到檔案另存至指定檔案中

例如:# sed '3,7w /tmp/fstab.txt' /etc/fstab

      # cat /tmp/fstab.txt

r /path/from/somefile:讀取指定檔案至比對到的行處 

例如,将/etc/issue插入到UUID之後

# sed '\/UUID/r /etc/issue' /etc/fstab

7.練習

練習1:删除/boot/grub/grub.conf檔案中是以空白開頭的行行首的空白;

sed 's/^[[:space:]]\+//g' /boot/grub/grub.conf

練習2:删除/etc/fstab檔案中所有以#開頭,後跟至少一個空白字元的行的行首的#和空白字元;

sed 's/^#[[:space:]]\+//' /etc/fstab

練習3:echo一個檔案路徑給sed指令,取出其基名;取出其目錄名;

# echo "/etc/sysconfig/" | sed 's@[^/]\{1,\}/\?$@@g'

解析:[^/]\{1,\}為非斜線字元出現至少一次

練習4:替換/etc/inittab檔案“id:數字:initdefault:”一行中的那個數字為6;

# sed 's@id:[0-9]:initdefault:@id:6:initdefault@' /etc/inittab

8.進階編輯指令:

h: 用模式空間中的内容覆寫保持空間中的内容;

H:把模式空間中的内容追求至保持空間;

g: get, 從保持空間取回資料至模式空間,覆寫模式空間中原有

G:GET, 從保持空間取回資料至模式空間,追加于模式空間中現

x: 把模式空間和保持空間中的内容進行交換;

n: 讀取比對到的行下一行至模式空間;

N: 追加讀比對到的行下一行至模式空間;

d: 删除模式空間中的内容;

D:删除多行模式空間中首行;

9.常用用法【進階指令】

sed '1!G;h;$!d' FILE

顯示檔案的偶數行:sed -n 'n;p' FILE;     sed -n '2~2p' FILE

1

2

3

4

顯示檔案的奇數行:sed -n 'p;n' FILE;     sed -n '1~2;p' FILE

10.進階指令練習

練習1:用sed将檔案的奇數行與偶數行

# sed '$!N;s@\n@\&\&@g' /etc/issu

練習2:說明以下sed指令的意義:

(1) sed '$!N;$!D' /etc/issue

(2) sed '$!d' /etc/issue

(3) sed 'G' /etc/issue

(4) sed '/^$/d;G' /etc/issue