簡介
- sed 是一種在線編輯器,它一次處理一行內(nèi)容。處理時逐纬,把當(dāng)前處理的行存儲在臨時緩沖區(qū)中,稱為“模式空間”(pattern space)矢沿,接著用sed命令處理緩沖區(qū)中的內(nèi)容滥搭,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕捣鲸。接著處理下一行论熙,這樣不斷重復(fù),直到文件末尾摄狱。文件內(nèi)容并沒有 改變脓诡,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件媒役;簡化對文件的反復(fù)操作祝谚;編寫轉(zhuǎn)換程序等。
參數(shù)
[root@www ~]# sed [-nefr] [動作]
選項與參數(shù):
-n :使用安靜(silent)模式酣衷。在一般 sed 的用法中交惯,所有來自 STDIN 的數(shù)據(jù)一般都會被列出到終端上。但如果加上 -n 參數(shù)后穿仪,則只有經(jīng)過sed 特殊處理的那一行(或者動作)才會被列出來席爽。
-e:直接在命令列模式上進行 sed 的動作編輯;
-f :直接將 sed 的動作寫在一個文件內(nèi)啊片, -f filename 則可以運行 filename 內(nèi)的 sed 動作只锻;
-r :sed 的動作支持的是延伸型正規(guī)表示法的語法。(默認是基礎(chǔ)正規(guī)表示法語法)
-i :直接修改讀取的文件內(nèi)容紫谷,而不是輸出到終端齐饮。
動作說明: [n1[,n2]]function
n1, n2 :不見得會存在,一般代表『選擇進行動作的行數(shù)』笤昨,舉例來說祖驱,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』
function:
a :新增瞒窒, a 的后面可以接字串捺僻,而這些字串會在新的一行出現(xiàn)(目前的下一行)~
c :取代, c 的后面可以接字串崇裁,這些字串可以取代 n1,n2 之間的行匕坯!
d :刪除,因為是刪除啊寇壳,所以 d 后面通常不接任何咚咚醒颖;
i :插入, i 的后面可以接字串壳炎,而這些字串會在新的一行出現(xiàn)(目前的上一行)泞歉;
p :列印逼侦,亦即將某個選擇的數(shù)據(jù)印出。通常 p 會與參數(shù) sed -n 一起運行~
s :取代腰耙,可以直接進行取代的工作哩榛丢!通常這個 s 的動作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是啦挺庞!
范例
1 p命令 ->打印
命令p用于顯示模式空間的內(nèi)容晰赞。默認情況下,sed把輸入行打印在屏幕上选侨,選項-n用于取消默認的打印操作掖鱼。當(dāng)選項-n和命令p同時出現(xiàn)時,sed可打印選定的內(nèi)容。
sed '/my/p' datafile
- 默認情況下援制,sed把所有輸入行都打印在標準輸出上戏挡。如果某行匹配模式my,p命令將把該行另外打印一遍晨仑。
sed -n '/my/p' datafile
- 選項-n取消sed默認的打印褐墅,p命令把匹配模式my的行打印一遍。
2 d命令 ->刪除
命令d用于刪除輸入行洪己。sed先將輸入行從文件復(fù)制到模式空間里妥凳,然后對該行執(zhí)行sed命令,最后將模式空間里的內(nèi)容顯示在屏幕上答捕。如果發(fā)出的是命令d逝钥,當(dāng)前模式空間里的輸入行會被刪除,不被顯示噪珊。
sed '$d' datafile
- 刪除最后一行晌缘,其余的都被顯示
sed '/my/d' datafile
- 刪除包含my的行齐莲,其余的都被顯示
3 s命令 ->替換
sed 's/^My/You/g' datafile
- 命令末端的g表示在行內(nèi)進行全局替換痢站,也就是說如果某行出現(xiàn)多個My,所有的My都被替換為You选酗。
sed -n '1,20s/My$/You/gp' datafile
- 取消默認輸出阵难,處理1到20行里匹配以My結(jié)尾的行,把行內(nèi)所有的My替換為You芒填,并打印到屏幕上呜叫。
sed 's#My#Your#g' datafile
- 緊跟在s命令后的字符就是查找串和替換串之間的分隔符。分隔符默認為正斜杠殿衰,但可以改變朱庆。無論什么字符(換行符、反斜線除外)闷祥,只要緊跟s命令娱颊,就成了新的串分隔符。
4 e選項 ->編輯
-e是編輯命令,用于sed執(zhí)行多個編輯任務(wù)的情況下箱硕。在下一行開始編輯前拴竹,所有的編輯動作將應(yīng)用到模式緩沖區(qū)中的行上。
sed -e '1,10d' -e 's/My/Your/g' datafile
- 選項-e用于進行多重編輯剧罩。第一重編輯刪除第1-3行栓拜。第二重編輯將出現(xiàn)的所有My替換為Your。因為是逐行進行這兩項編輯(即這兩個命令都在模式空間的當(dāng)前行上執(zhí)行)惠昔,所以編輯命令的順序會影響結(jié)果幕与。
5 r命令 ->讀
r命令是讀命令。sed使用該命令將一個文本文件中的內(nèi)容加到當(dāng)前文件的特定位置上镇防。
sed '/My/r introduce.txt' datafile
- 如果在文件datafile的某一行匹配到模式My纽门,就在該行后讀入文件introduce.txt的內(nèi)容。如果出現(xiàn)My的行不止一行营罢,則在出現(xiàn)My的各行后都讀入introduce.txt文件的內(nèi)容赏陵。
6 w命令
sed -n '/hrwang/w me.txt' datafile
7 a 命令
a\ 命令是追加命令,追加將添加新文本到文件中當(dāng)前行(即讀入模式緩沖區(qū)中的行)的后面饲漾。所追加的文本行位于sed命令的下方另起一行蝙搔。如果要追加的內(nèi)容超過一行,則每一行都必須以反斜線結(jié)束考传,最后一行除外吃型。最后一行將以引號和文件名結(jié)束。
sed '/^hrwang/a\
hrwang and mjfan are husband
and wife' datafile
- 如果在datafile文件中發(fā)現(xiàn)匹配以hrwang開頭的行僚楞,則在該行下面追加hrwang and mjfan are husband and wife
8 i 命令
i 命令是在當(dāng)前行的前面插入新的文本勤晚。
9 c 命令
sed使用該命令將已有文本修改成新的文本。
10 y命令
該命令與UNIX/Linux中的tr命令類似泉褐,字符按照一對一的方式從左到右進行轉(zhuǎn)換赐写。例如,y/abc/ABC/將把所有小寫的a轉(zhuǎn)換成A膜赃,小寫的b轉(zhuǎn)換成B挺邀,小寫的c轉(zhuǎn)換成C。
sed '1,20y/hrwang12/HRWANG^$/' datafile
- 將1到20行內(nèi)跳座,所有的小寫hrwang轉(zhuǎn)換成大寫端铛,將1轉(zhuǎn)換成^,將2轉(zhuǎn)換成$。
- 正則表達式元字符對y命令不起作用疲眷。與s命令的分隔符一樣禾蚕,斜線可以被替換成其它的字符。
11 q命令
q命令將導(dǎo)致sed程序退出狂丝,不再進行其它的處理换淆。
sed '/hrwang/{s/hrwang/HRWANG/;q;}' datafile
常用示例:
sed -i 's/\t/,/g' filename //把tab 替換成 “虚倒,”
cat filename | sed 's/[ ][ ]/,/g' cat lse | sed 's/\s+/,/g' 替換空格
cat lse | sed -e 's/[[:space:]][[:space:]]/,/g' 如果空格與tab共存時用
1:把文件filename中的a字符換成A字符
sed -i "s/a/A/g" filename
2:替換為空格 將tab替換為空格
sed -i "s/\t/ /g" filename
二、實例
1)替換:s命令
sed -e 's/123/1234/' a.txt
將a.txt文件中所有行中的123用1234替換(-e表示命令以命令行的方式執(zhí)行产舞;參數(shù)s魂奥,表示執(zhí)行替換操作)
sed -e '1 s/12/45/' a.txt
把第一行的12替換成45
sed -n 's/^test/mytest/p' example.file
(-n)選項和p標志一起使用表示只打印那些發(fā)生替換的行。也就是說易猫,如果某一行開頭的test被替換成mytest耻煤,就打印它。(^這是正則表達式中表示開頭准颓,該符號后面跟的就是開頭的字符串)(參數(shù)p表示打印行)
sed -n 's/loveable/\1rs/p' example.file
love被標記為1哈蝇,所有l(wèi)oveable會被替換成lovers,而且替換的行會被打印出來攘已。需要將這條命令分解炮赦,s/是表示替換操作,love表示選中l(wèi)ove字符串样勃,loveable/表示包含loveable的行吠勘,loveable/\l表示love字符串標記為1,表示在替換過程中不變峡眶。rs/表示替換的目標字符串剧防。這條命令的操作含義:只打印替換了的行
sed 's#10#100#g' example.file
不論什么字符,緊跟著s命令的都被認為是新的分隔符辫樱,所以峭拘,“#”在這里是分隔符,代替了默認的“/”分隔符狮暑。表示把所有10替換成100
sed -i 's/now/right now/g' test_sed_command.txt
表示直接操作文件test_sed_command.txt鸡挠,將文件test_sed_command.txt中所有的now用right now替換。參數(shù)-i搬男,表示直接操作修改文件拣展,不輸出
echo 112.111 | sed -e 's/..*//g'
將小數(shù)點及之后的內(nèi)容清除,以上輸出是112(.表示匹配"."符號止后,之后跟著.表示1個到多個字符,如果只是.的話瞎惫,只會匹配"."字符,因為*號是0個到多個)
echo aaaa.mpg.bak | sed -e 's;.?..?..*;\1;g'
輸出:aaaa.mpg
sed 's/^wangpan/&19850715/' example.file
表示被替換換字符串被找到后译株,被替換的字符串通過&符號連接給出的字符串組成新字符傳替換被替換的字符串,所有以wangpan開頭的行都會被替換成它自已加19850715,變成wangpan19850715
2)選定行范圍挺益,逗號
sed -e '3,5 a4' a.txt
將a.txt文件中的3行到5行之間所有行的后面添加一行內(nèi)容為4的行(參數(shù)a歉糜,表示添加行,參數(shù)a后面指定添加的內(nèi)容)
sed -n '/love/,/unlove/p' example.file
只打印包含love字符串行到包含unlove字符串行之間的所有行(確定行的范圍就是通過逗號實現(xiàn)的)
sed -n '5,/^wang/p' example
只打印從第五行開始到第一個包含以wang開始的行之間的所有行
3)編輯 e命令
sed --expression='s/test/check/' --expression='/love/d' example.file
一個比-e更好的命令是--expression望众。它能給sed表達式賦值匪补。
sed -e '11,53d' -e 's/wang/pan/' example.file
(-e)選項允許在同一行里執(zhí)行多條命令伞辛。如例子所示,第一條命令刪除11至53行夯缺,第二條命令用pan替換wang蚤氏。命令的執(zhí)行順序?qū)Y(jié)果有影響。如果兩個命令都是替換命令踊兜,那么第一個替換命令將影響第二個替換命令的結(jié)果竿滨。(參數(shù)d,表示刪除指定的行)
4)從文件讀寫:r命令和w命令
sed '/wangpan/r file' example.file
file里的內(nèi)容被讀進來捏境,顯示在與wangpan匹配的行后面于游,如果匹配多行,則file的內(nèi)容將顯示在所有匹配行的下面垫言。參數(shù)r贰剥,表示讀出文件,后面空格緊跟文件名稱
sed -n '/test/w file' example.file
在example.file中所有包含test的行都被寫入file里筷频。參數(shù)w蚌成,表示將匹配的行寫入到指定的文件file中
5)追加和插入命令:a命令和i命令
sed '/^test/a\this is a example' example.file
'this is a example'被追加到以test開頭的行后面,sed要求命令a后面有一個反斜杠凛捏。
sed '/test/i\oh! My god!' example.file
'oh! My god!'被追加到包含test字符串行的前面笑陈,參數(shù)i表示添加指定內(nèi)容到匹配行的前面,sed要求參數(shù)i后面有一個反斜杠(也可以不加)
6)變形:y命令
sed '1,10y/abcde/ABCDE/' example.file
把1-10行內(nèi)所有abcde轉(zhuǎn)變?yōu)榇髮懣⒁夂祝齽t表達式元字符不能使用這個命令。參數(shù)y坡锡,表示把一個字符翻譯為另外的字符(但是不用于正則表達式)
7)保持和獲扰钔:h命令和G命令
sed -e '/old/h' -e '/girl-friend/G' test_sed_command.txt
首先了解參數(shù)h,拷貝匹配成功行的內(nèi)容到內(nèi)存中的緩沖區(qū)鹉勒。在了解參數(shù)G帆锋,獲得內(nèi)存緩沖區(qū)的內(nèi)容,并追加到當(dāng)前模板塊文本的后面禽额。上面命令行的含義:將包含old字符串的行的內(nèi)容保存在緩沖區(qū)中锯厢,然后將緩沖區(qū)的內(nèi)容拿出來添加到包含girl-friend字符串行的后面。隱含要求搜集到緩沖區(qū)的匹配行在需要添加行的前面
8)保持和互換:h命令和x命令
sed -e '/test/h' -e '/wangpan/x' example.file
將包含test字符串的行的內(nèi)容保存在緩沖區(qū)中脯倒,然后再將緩沖區(qū)的內(nèi)容替換包含wangpan字符串的行实辑。參數(shù)x,表示行替換操作藻丢。隱含要求搜集到緩沖區(qū)的匹配行在需要被替換行的前面
三剪撬、收集
- sed -e 's/123/1234/' a.txt
將a.txt文件中所有行中的123用1234替換,每行只匹配第一次(-e表示命令以命令行的方式執(zhí)行;參數(shù)s悠反,表示執(zhí)行替換操作残黑,不改變原文件)
2.#sed -e 's/123/1234/g' a.txt
將a.txt文件中所有行中的123用1234替換,每行匹配多次(-e表示命令以命令行的方式執(zhí)行馍佑;參數(shù)s,表示執(zhí)行替換操作梨水;參數(shù)g拭荤,表示每行匹配多次,不改變原文件)
3.# sed -e '3,5 a4' a.txt
將a.txt文件中的3行到5行之間所有行的后面添加一行內(nèi)容為4的行(參數(shù)a疫诽,表示添加行舅世,參數(shù)a后面指定添加的內(nèi)容,不改變原文件)
4.# sed -e '1 s/12/45/' a.txt
把第一行的12替換成45(不改變原文件)
5.#sed -i "s/456aaa/444aaa/" grep 456aaa -lr /mnt/
在/mnt/share目錄下所有的文件及所有子目錄下的文件中找出包括aaa456的文件(不包括文件夾),將找出來的文件中的456aaa替換成444aaa(-i表示直接改變文件)
6.#sed -n 's/^test/mytest/p' example.file
(-n)選項和p標志一起使用表示只打印那些發(fā)生替換的行踊沸。也就是說歇终,如果某一行開頭的test被替換成mytest,就打印它逼龟。(^這是正則表達式中表示開頭评凝,該符號后面跟的就是開頭的字符串)(參數(shù)p表示打印行)
7.#sed 's/^wangpan/&19850715/' example.file
表示被替換換字符串被找到后,被替換的字符串通過&符號連接給出的字符串組成新字符傳替換被替換的字符串,所有以wangpan開頭的行都會被替換成它自已加19850715腺律,變成wangpan19850715
8.#sed -n 's/loveable/\1rs/p' example.file
love被標記為1奕短,所有l(wèi)oveable會被替換成lovers,而且替換的行會被打印出來匀钧。需要將這條命令分解翎碑,s/是表示替換操作,love表示選中l(wèi)ove字符串之斯,loveable/表示包含loveable的行日杈,loveable/\1表示love字符串標記為1,表示在替換過程中不變佑刷。rs/表示替換的目標字符串莉擒。這條命令的操作含義:只打印替換了的行,如果替換字符和被替換字符有部分內(nèi)容相同,則可用這種標記方法
9.#sed 's#10#100#g' example.file
不論什么字符瘫絮,緊跟著s命令的都被認為是新的分隔符涨冀,所以,“#”在這里是分隔符麦萤,代替了默認的“/”分隔符鹿鳖,但是在一個表達示中,不能把不同字符混合用作分隔符壮莹。表示把所有10替換成100翅帜。
10.#sed -n '/love/,/unlove/p' example.file
只打印包含love字符串行到包含unlove字符串行之間的所有行,如果找不到unlove,則一直到最后一行(確定行的范圍就是通過逗號實現(xiàn)的)
11.#sed -n '5,/^wang/p' example
只打印從第五行開始到第一個包含以wang開始的行之間的所有行
12.#sed '/love/,/unlove/s/$/jeffery/p' example.file
對于包含love字符串的行到包含unlove字符串之間的行垛孔,每行的末尾用字符串jeffery替換藕甩。
字符串$/表示以字符串結(jié)尾的行,$/表示每一行的結(jié)尾周荐,s/$/jeffery/表示每一行的結(jié)尾添加jeffery字符串
13.#sed -e '11,53d' -e 's/wang/pan/' example.file
(-e)選項允許在同一行里執(zhí)行多條命令狭莱。如例子所示,第一條命令刪除11至53行概作,第二條命令用pan替換wang腋妙。命令的執(zhí)行順序?qū)Y(jié)果有影響。如果兩個命令都是替換命令讯榕,那么第一個替換命令將影響第二個替換命令的結(jié)果骤素。(參數(shù)d,表示刪除指定的行)
14.# sed --expression='s/wang/pan/' --expression='/love/d' example.file
一個比-e更好的命令是--expression愚屁。它能給sed表達式賦值济竹。
15.#sed '/wangpan/r file' example.file
file里的內(nèi)容被讀進來,顯示在與wangpan匹配的行后面霎槐,如果匹配多行送浊,則file的內(nèi)容將顯示在所有匹配行的下面。參數(shù)r丘跌,表示讀出文件袭景,后面空格緊跟文件名稱
16.# sed -n '/test/w file' example.file
在example.file中所有包含test的行都被寫入file里。參數(shù)w闭树,表示將匹配的行寫入到指定的文件file中
17.sed '/test/i\oh! My god!' example.file
'oh! My god!'被追加到包含test字符串行的前面耸棒,參數(shù)i表示添加指定內(nèi)容到匹配行的前面一行,sed要求參數(shù)i后面有一個反斜杠
18.#sed '1,10y/abcde/ABCDE/' example.file
把1—10行內(nèi)所有abcde轉(zhuǎn)變?yōu)榇髮懕ㄈ瑁⒁庥胙辏齽t表達式元字符不能使用這個命令。參數(shù)y碍现,表示把一個字符翻譯為另外的字符(但是不用于正則表達式)
19.#find . -name "*.log" -exec rm -f {} ;
查找當(dāng)前目錄及子目錄里所有的文件幅疼,刪除文件名以log為后綴的文件 -exec可以對find出來的結(jié)果執(zhí)行命令, {} ;代表find出來的結(jié)果鸵赫,除了-name參數(shù)外衣屏,經(jīng)常用的還有:
1)-mtime,-ctime,atime都是指按時間查找,-mtime是文件的修改時間辩棒,-ctime是文件的創(chuàng)建時間狼忱,atime是后找開文件時間;
2)-type 指定查找的文件的類型一睁,它有d,l,b,p,f,c等文件類型,d是查找目錄钻弄,l是查找鏈接檔,b是查找塊文件者吁,p是查找管道文件窘俺,f是普通文件,c是字符設(shè)備文件复凳;
3)-perm 0700 查權(quán)限為700的文件或目錄瘤泪;
4)-size +512k 查大于512k的文件 灶泵;-size -512k 查小于512k的文件;
5)-mtime +2 兩天以前修改過的文件对途; -mtime -2 兩天內(nèi)修改過的文件赦邻;-atime -2 兩天內(nèi)訪問過的文件;-ctime -2 兩天內(nèi)創(chuàng)建的文件
- 合并文件里所有行到一行
sed ':a;N;s/\r\n/ /;ta' file # 注意有些是"\r\n",有些只有"\n"实檀, 可以用文件編輯器16進制查看是哪種