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

(5) sed 'n;d' /etc/issue

(6) sed -n '1!G;h;$p' /etc/issue


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章