1. 程式人生 > >Linux文本處理工具sed

Linux文本處理工具sed

sed

文本處理Sed!!!

sed是一個行編輯器,用於修改文件內容

功能:用於處理編輯一個或多個文件

官網:http://www.gnu.org/software/sed/manual/sed.html

默認情況下,sed每讀入一行會自動的把讀入模式空間的數據打印出來,處理完成後,會接著自動讀入下一行,開始下一輪循環,如果後面沒有‘D’這種的特殊指令,會在兩個循環之間清空模式空間,意思就是在讀入下一行的時候會清掉上一行,如果有'D'這樣的指令,就不會清空前面的那一行數據了,默認情況下不會修改文件內容,除非加入一些指令


用法:

sed [option]...'script(意味著sed命令自帶的語言)' inputfile(要處理的文件,可以寫多個)...

script的格式:

由'地址命令'組成,地址代表的就是要處理的文件中的某些行,而命令代表的sed中的一些指令


常用選項:

-n:不輸出模式空間內容到屏幕,也就是不自動打印

-e:多點編輯

-f:/PATH/script_file:從指定文件中讀取編輯腳本

-r:支持使用擴展正則表達式

-i.bak:加一個後綴的話會先做一個備份文件之後開始編輯文件

(例子:sed -i.bak '7a alias cdnet="cd /etc/sysconfig/network-scripts"' ~/.bashrc先將~/.bashrc文件備份為~/.bash.bak文件然後在~/.bashrc的第7行下面添加一個別名)


地址定界:

(1)不給地址:對全文進行處理

(2)單地址:

#:直接給個行號,可以直接顯示某一行(例子:sed -n '2p' /etc/issue 只打印/etc/issue的第二行,p是打印的意思)

$:代表最後一行(例子:sed -n '$p' /etc/fstab,僅打印最後一行)

模式:兩個//之間,可以寫正則表達式,(例子:sed -n '/^U/p' /etc/fstab,僅將U開頭的行打印出來,p是打印的意思)

(3)地址範圍:

#,#:行的範圍,從第幾行到第幾行(例子:sed -n '9,12p' /etc/fstab,僅打印文件中第9行到第12行之間的數據)

#,+#:第幾行到這一行之後的多少行(例子:sed -n '9,+3p' /etc/fstab.僅打印文件中第9行到第9行之後的數據,也就是9到9+3之間的行)

/part1/,/part2/:兩個模式之間的行(例子:sed -n '/^b/,/^l/p' /etc/passwd僅顯示b開頭到l開頭的行);

但要註意,如果匹配到結束位置之後下面如果還有符合第一個模式的值,就還會繼續顯示,接著會尋找第二個模式相匹配的行,如果沒有就會全部顯示

#,/part1/:表示從第幾行到模式(例子:sed -n '3,/^f/p',僅打印從第三行到以f開頭的行,模式與#反過來寫也可以,比如說:

sed -n '/^f/,20p',僅打印以f開頭的行到第20行之間的數據)

(4)~步進:(就是從開始位置遞增每次遞增幾行,一直到結束)

1~2奇數行,1-3-5-7-9...

(例子:sed -n '1~2p' /etc/passwd,僅打印從第一行開始每次遞增兩行也就是第一行,然後第一行+2=3,第三行+2等於5,以此類推一直到結束)

2~2偶數行,2-4-6-8-10....

(例子:sed -n '2~2' /etc/passwd,僅打印從第二行開始每次遞增兩行也就是第二行,然後第二行+2=4,第四行+2等於6,以此類推一直到結束)


編輯命令:

p:滿足前面地址定界就打印

d:刪除模式空間匹配的行,默認情況下會將每一行讀取到模式空間裏,並開始下一輪循環,就讀入新的一行

(例子:cat -n /etc/passwd | sed '20,30d' 顯示刪除20-30之後的行,因為sed會自動打印模式空間的數據,如果加上-n就會全部都不顯示)

a[\]text:如果地址滿足條件則在地址匹配的行的下面追加文本,直接在a後面輸入要追加的數據可以,也可以在a前面輸入一個\意思就是\後面的文本都是要追加的文本,適用於要追加空格,如果要添加多行,需要換行的話,在要換行的位置輸入\n即可

i[\]text:如果地址滿足條件則在地址匹配的行的上面追加文本,直接在i後面輸入要追加的數據可以,也可以在i前面輸入一個\,意思就是\後面的文本都是要追加的文本,適用於要追加空格,如果要添加多行,需要換行的話,在要換行的位置輸入\n即可

c[\]text:替換前面地址滿足的行

w "路徑文件":將符合模式的行存到一個新的文件中(例子:sed '/^alias/w/app/f1.txt' ~/.bashrc,將~/.bashrc文件中以alias開頭的行存到/app/f1.txt文件中並且打印在屏幕)

r "路徑文件":讀取路徑文件中的數據到符合地址對應的文件後面(例子:sed '/^alias/r/etc/centos-release' ~/.bashrc,將/etc/centos-release中的數據讀取到~/.bashrc的以alias開頭的行下面)

=:顯示符合條件的行的行號(例子:sed '/^alias/=' ~/.bashrc,顯示~/.bashrc中以alias開頭的行的行號)

!:取反(例子:sed -n '/^alias/!p' ~/.bashrc 除了以alias開頭的行其他的行都打印)


非常實用的技術!!!(敲黑板,必會!)

s///:搜索替代,支持使用其他分隔符,s@@@,s###...如果默認這樣寫,只替代這一行裏找到的第一個字符串

替換標記:

g:將全部匹配的全部替換

p:顯示替換成功的行

w:跟上面含義一樣的

例子:

sed 's#/bin/bash$#/sbin/nologin#' /etc/passwd,將/etc/passwd文件中所有以/bin/bash結尾的行替換為以/sbin/nologin結尾

sed -r 's#(/bin/bash$)#------\1=====#' /etc/passwd,/etc/passwd文件中在/bin/bash的前面和後面加上---和===字符


Linux文本處理工具sed