Sed簡介
sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處 理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有 改變,除非你使用重定向存儲輸 出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。
定址
可以通過定址來定位你所希望編輯的行,該地址用數字構成,用逗號分隔的兩個行數表示以這兩行為起止的行的范圍(包括行數表示的那兩行)。如1,3表示1,2,3行 ,美元符號($)表示最后一行 ,1~2表示奇數行,1~2表示偶數行。范圍可以通過數據,正則表達式或者二者結合的方式確定 。
sed命令
利用script處理文本文件
語法
sed [OPTION]… {script-only-if-no-other-script} [input-file]…
常用選項
-n:不輸出模式空間內容的自動打印
-e: 多點編輯
-f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本
-r: 支持使用擴展正則表達式
-i: 原處編輯(慎用)
script
調用sed命令有兩種形式:
a\ 在當前行后面加入一行文本。
d 從模板塊(Pattern space)位置刪除行。
i\ 在當前行上面插入文本。
c\ 用新的文本改變本行的文本。
p 打印模板塊的行。
r file 從file中讀行
w file 寫并追加模板塊到file末尾。
! 表示后面的命令對所有沒有被選定的行發生作用。(取反)
= 打印當前行號碼。
s/re/string 用string替換正則表達式re。
g 表示行內全面替換。
p 表示打印行。
w 表示把行寫入一個文件。
& 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。
示例
sed '2d' test #刪除test文件的第二行
sed '2,$d'test #刪除文件的第二行到末尾所有行
sed '$d' file #刪除文件file的最后一行
sed '/text/d' text #刪除帶有text的行
sed -n 's/system/config/gp' test #把system替換為config,只顯示被匹配到的行,g使行內多個符合匹配都能匹配(默認匹配沒行的第一個)
sed -n 's/\(love\)ly/\1er/pg' test #把所有的lovely替換為loveer,且打印出來
sed -n 's@192.168.1.1@myipis&@p' test #把192.168.1.1都會替換成為myipis192.168.1.1。緊隨s的符號都被認為是分隔符,所以@在這里就是分隔符
sed -e '1,2d' -e 's#haha#laugh#' test #允許在同一行里執行多條命令。如例子里第一條命令刪除1至2行,第二條命令用laugh替換haha。
1、刪除/etc/grub.conf文件中所有以空白開頭的行行首的空白字符
sed 's#^[[:space:]]\+##' /etc/grub.conf
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
sed 's@^#[[:space:]]\+@@' /etc/fstab
3、在/root/install.log每一行行首增加#號
sed 's@^@&#@' /root/install.log
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
sed 's@[^#]@#@' /etc/fstab
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
echo '/etc/fstab' | sed -r 's#(.*/)([^/]+/?)#\1#'
echo '/etc/fstab' | sed -r 's#(.*/)([^/]+/?)#\2#'
6、利用sed 取出ifconfig命令中本機的IPv4地址
ifconfig|sed -n '/inet addr/p' |tr -s ':' ' '|cut -d' ' -f4
7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
ls /media/Package |sed -r 's@.*\.(.*)\.rpm$@\1@'|sort|uniq -c
sed命令的高級用法
高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
示例
[root@localhost /]# cat passwd #測試文件 1wang:x:507:507::/home/wang:/bin/bash 2mage:x:508:508::/home/mage:/bin/bash 3uuuu:x:509:509:/bin/bash:/home/uuuu:/bin/bash 4fedora:x:510:510::/home/fedora:/bin/bash 5user1:x:511:511::/home/user1:/bin/bash 61100:x:1100:1100::/home/1100:/bin/bash 7499:x:495:1101::/home/499:/bin/bash 81999:x:1999:1999::/home/1999:/bin/bash 91820:x:1500:1500::/home/1820:/bin/bash 10GLLL:x:2000:2000::/home/GLLL:/bin/bash [root@localhost /]# sed -n 'n;p' passwd #僅顯示偶數行 2mage:x:508:508::/home/mage:/bin/bash 4fedora:x:510:510::/home/fedora:/bin/bash 61100:x:1100:1100::/home/1100:/bin/bash 81999:x:1999:1999::/home/1999:/bin/bash 10GLLL:x:2000:2000::/home/GLLL:/bin/bash [root@localhost /]# sed '1!G;h;$!d' passwd #倒序顯示 10GLLL:x:2000:2000::/home/GLLL:/bin/bash 91820:x:1500:1500::/home/1820:/bin/bash 81999:x:1999:1999::/home/1999:/bin/bash 7499:x:495:1101::/home/499:/bin/bash 61100:x:1100:1100::/home/1100:/bin/bash 5user1:x:511:511::/home/user1:/bin/bash 4fedora:x:510:510::/home/fedora:/bin/bash 3uuuu:x:509:509:/bin/bash:/home/uuuu:/bin/bash 2mage:x:508:508::/home/mage:/bin/bash 1wang:x:507:507::/home/wang:/bin/bash [root@localhost /]# sed '$!N;$!D' passwd #僅顯示最后兩行 91820:x:1500:1500::/home/1820:/bin/bash 10GLLL:x:2000:2000::/home/GLLL:/bin/bash [root@localhost /]# sed '$!d' passwd #顯示最后一行 10GLLL:x:2000:2000::/home/GLLL:/bin/bash
原創文章,作者:ladsdm,如若轉載,請注明出處:http://www.www58058.com/33960