sed.md

SED

sed是一種流編輯器,它是文本處理中很是中的工具,可以完美的配合正則表達式使用,功能與衆不同。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。html

選項

  • -e command,--expression=command直接在指令列模式上進行 sed 的動做編輯;web

  • -n,--quiet,--silent:使用安靜(silent)模式。在通常 sed 的用法中,全部來自 STDIN的資料通常都會被列出到螢幕上。但若是加上 -n 參數後,則只有通過sed 特殊處理的那一行(或者動做)纔會被列出來。正則表達式

  • -f,--filer=script-file:直接將 sed 的動做寫在一個檔案內, -f filename 則能夠執行 filename 內的sed 動做;shell

  • -r, --regexp-extended:支持使用擴展正則表達式;express

  • -i[SUFFIX], --in-place[=SUFFIX]:直接編輯原文件 ;編輯器

命令

  • a 在當前行後面加入一行文本。工具

  • b lable分支到腳本中帶有標記的地方,若是分支不存在則分支到腳本的末尾。ui

  • c 用新的文本改變本行的文本。spa

  • d 從模板塊(Pattern space)位置刪除行。.net

  • D 刪除模板塊的第一行。

  • i 在當前行上面插入文本。

  • h 拷貝模板塊的內容到內存中的緩衝區。

  • H 追加模板塊的內容到內存中的緩衝區

  • g 得到內存緩衝區的內容,並替代當前模板塊中的文本。

  • G 得到內存緩衝區的內容,並追加到當前模板塊文本的後面。

  • l 列表不能打印字符的清單。

  • n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。

  • N 追加下一個輸入行到模板塊後面並在兩者間嵌入一個新行,改變當前行號碼。

  • p 打印模板塊的行。

  • P(大寫)打印模板塊的第一行。

  • q 退出Sed。

  • r file從file中讀行。

  • t labelif分支,從最後一行開始,條件一旦知足或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。

  • T label錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。

  • w file寫並追加模板塊到file末尾。

  • W file寫並追加模板塊的第一行到file末尾。

  • ! 表示後面的命令對全部沒有被選定的行發生做用。

  • s/re/string/ 查找替換,其分隔符可自行指定,經常使用的有s@@@, s###等;

  • = 打印當前行號碼。

  • # 把註釋擴展到下一個換行符之前。

替換標記

  • g 表示行內全面替換。

  • p 表示打印行。

  • w 表示把行寫入一個文件。

  • x 表示互換模板塊中的文本和緩衝區中的文本。

  • y 表示把一個字符翻譯爲另外的字符(可是不用於正則表達式)

  • \1 子串匹配標記

  • & 已匹配字符串標記

元字符

  • ^錨定行的開始如:/^sed/匹配全部以sed開頭的行。

  • $錨定行的結束 如:/sed$/匹配全部以sed結尾的行。

  • .匹配一個非換行符的字符 如:/s.d/匹配s後接一個任意字符,而後是d。

  • *匹配零或多個字符 如:/*sed/匹配全部模板是一個或多個空格後緊跟sed的行。

  • []匹配一個指定範圍內的字符,如/[Ss]ed/匹配sed和Sed。

  • [^]匹配一個不在指定範圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。

  • \(..\)保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。

  • &;保存搜索字符用來替換其餘字符,如s/love/**&**/,love這成**love**

  • \<;錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。

  • \>;錨定單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。

  • x\{m\}重複字符x,m次,如:/0\{5\}/匹配包含5個o的行。

  • x\{m,\}重複字符x,至少m次,如:/o\{5,\}/匹配至少有5個o的行。

  • x\{m,n\}重複字符x,至少m次,很少於n次,如:/o\{5,10\}/匹配5--10個o的行。

地址定位

定址用於決定對哪些行進行編輯。地址的形式能夠是數字、正則表達式、或兩者的結合。若是沒有指定地址,sed將處理輸入文件的全部行。

空地址

空地址就是對全文進行處理。

單地址

單地址能夠匹配指定的行,也能夠按模式進行匹配。

  • #(數字):匹配指定的行。

  • /pattern/:被此模式所匹配到的每一行。

地址範圍

  • #,#:從#行到#行匹配。

  • #,+#:從#行到以後的#行匹配。

  • #,/pat1/:從#行開始到以後第一個pat1模式匹配。

  • /pat1/,/pat2/:從pat1模式到pat2模式之間匹配。

  • $:最後一行

步進

  • 1~2:全部奇數行

  • 2~2:全部偶數行

編輯命令

打印p

命令p用於顯示模式空間的內容。默認狀況下,sed把輸入行打印在屏幕上,選項-n用於取消默認的打印操做。當選項-n和命令p同時出現時,sed可打印選定的內容。

# sed '/root/p' filename

若是某行匹配模式root,p命令將把該行另外打印一遍。

# sed -n  '/root/p'

選項-n取消sed默認的打印,p命令把匹配模式root的行打印一遍。

# sed -n '1p' filename

顯示第一行。

# sed -n '$p' filename

顯示最後一行。

# sed -n '2,5p' filename

顯示第二到第五行。

# sed -n '5,$p' filename

顯示第五行到最後一行。

刪除d

命令d用於刪除輸入行。sed先將輸入行從文件複製到模式空間裏,而後對該行執行sed命令,最後將模式空間裏的內容顯示在屏幕上。若是發出的是命令d,當前模式空間裏的輸入行會被刪除,不被顯示。

# sed '1d' filename

刪除第一行。

# sed '$d' filename

刪除最後一行。

# sed '2,5d' filename

第二行到第五行刪除。

# sed '5,$d' filename

第五行以後的行刪除。

當前行前插入i

i\ 命令是在當前行的前面插入新的文本。

# sed  '1i\test' filename

在第一行錢插入test。

# sed '2,5i\test' filename

在第二行到第五行前插入test。

# sed '2,5i\test\ntest' filename

上面是添加兩行test。使用\n換行符。

從當前行後插入a

使用方法和前面的i同樣只不過插入的位置的區別。

修改c

在使用c 命令時是將匹配的行替換成指定的內容。

讀入文件r

r命令是讀命令。sed使用該命令將一個文本文件中的內容經過匹配添加到文件的特定位置上。

# sed '/root/r test.txt' filename

讀入的文件須要指定正確的位置,上面的例子中先匹配root行而後在其後的下一行讀入test.txt文件的內容。若是匹配的root有多個則添加屢次。

寫入文件w

w 是寫入文件,其是將匹配的內容寫入到指定的文件中。

# sed '2,5w aaa' filename

上面的例子是匹配filename的第二到第五行,並將其寫入到當前路徑的aaa文件中。

查找替換s

# cat test 
dota dota dota
df dota dota  dota
ta dota
 dota sa
ss dota
# sed 's/dota/DOTA/' test 
DOTA dota dota
df DOTA dota  dota
ta DOTA
 DOTA sa
ss DOTA

將文件匹配行的第一個dota替換成DOTA。

# sed 's/dota/DOTA/g' test
DOTA DOTA DOTA
df DOTA DOTA  DOTA
ta DOTA
 DOTA sa
ss DOTA

這個是全局替換。

# sed 's/dota/DOTA/2g' test
dota DOTA DOTA
df dota DOTA  DOTA
ta dota
 dota sa
ss dota

將匹配行的第二個dota開始的全部DOTA 替換成ROOT。

# sed 's/dota/DOTA/2' test
dota DOTA dota
df dota DOTA  dota
ta dota
 dota sa
ss dota

將文件匹配行第二個root替換DOTA。

# sed -n 's/dota/DOTA/2p' test
dota DOTA dota
df dota DOTA  dota

將匹配替換的行給打印出來。

# sed 's/^/#/' test
#dota dota dota
#df dota dota  dota
#ta dota
# dota sa
#ss dota

給文件每行的前面添加#符。

# sed 's/^..//' test
ta dota dota
 dota dota  dota
 dota
ota sa
 dota

刪除文件的前兩個字符。

# sed 's/.//3' test
doa dota dota
dfdota dota  dota
tadota
 dta sa
ssdota

刪除第三個字符。

標記

已匹配的字符串標記&

正則表達式\w+ 匹配每個單詞,使用[&] 替換它,& 對應於以前所匹配的單詞。

# sed 's/\w\+/[&]/' test 
[dota] dota dota
[df] dota dota  dota
[ta] dota
 [dota] sa
[ss] dota

將每行的第一個單詞加上[]符號。若是想所有都加速使用g 進行替換標記。

# sed 's/\<dota\>/cn_&/' test 
cn_dota dota dota
df cn_dota dota  dota
ta cn_dota
 cn_dota sa
ss cn_dota

將每行第一個的dota字符串加上cn_。

子字串標記\1

# sed -r 's/(^.*)(:.*:)(.*$)/\3\2\1/' /etc/passwd

將/etc/passwd 文件中以:爲分隔符把第一個字串後最後一個字串互換。

# echo dota |sed -r 's/([a-z]+)/\1er/'
dotaer

將匹配的字串後面添加指定的字符。

多個匹配

# sed -r  '1,2s/dota/DOTA/g; 3,$s/(dota)/\1er/g' test 
DOTA DOTA DOTA
df DOTA DOTA  DOTA
ta dotaer
 dotaer sa
ss dotaer

將前兩行的dota 改爲DOTA,把第三行開始到最後的全部dota 後添加er。

# sed -r -e '1,2s/dota/DOTA/g' -e '3,$s/(dota)/\1er/g' test 
DOTA DOTA DOTA
df DOTA DOTA  DOTA
ta dotaer
 dotaer sa
ss dotaer

上面兩個的效果相同。

# sed  '1,2s/dota/DOTA/g' test |sed -r '3,$s/(dota)/\1er/g'
DOTA DOTA DOTA
df DOTA DOTA  DOTA
ta dotaer
 dotaer sa
ss dotaer

也能夠經過管道的方式實現。

練習題

刪除/boot/grub2/grub.cfg文件中全部以空白字符開頭的行的行首的全部空白字符;

# sed -r  's/(^[[:space:]]+)(.*)/\2/' /boot/grub2/grub.cfg
# sed  's@^[[:space:]]\+@@' /boot/grub2/grub.cfg

刪除/etc/fstab文件中全部以#開頭的行的行首的#號及#後面的全部空白字符;

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

輸出一個絕對路徑給sed命令,取出其目錄,其行爲相似於dirname;

# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'

高級用法

h;G

將第一行的內容放到打三行後面

# cat bbb
11111
22222
33333
44444
55555
# sed '1h;3G'  bbb 
11111
22222
33333
11111
44444
55555

在每行的後面添加1個空行
注:1.保留空間裏默認有一個空白行。2,‘G’默認處理全局

# sed '1,$G' bbb 
11111

22222

33333

44444

55555

# sed 'G' bbb 
11111

22222

33333

44444

55555

把第1行到第4行的數據複製到第5行後面
注:1h是爲了覆蓋保留空間裏的空白行

# sed '1h;2,4H;5G' bbb 
11111
22222
33333
44444
55555
11111
22222
33333
44444

把第1行到第4行的數據剪切到第5行後面

# sed '1h;2,4H;1,4d;5G' bbb 
55555
11111
22222
33333
44444

對匹配行的下一行進行處理n

# sed -n '1n;p' bbb 
22222
33333
44444
55555

交換模式空間和保留空間的內容x

# sed '1h;3x' bbb 
11111
22222
11111
44444
55555

 


 

 

圖片鏈接:http://coolshell.cn/articles/9104.html

參考與擴展:

http://sed.sourceforge.net/sed1line_zh-CN.html
http://tanxin.blog.51cto.com/6114226/1208944
http://coolshell.cn/articles/9104.html

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息