sed其實是乙個非常簡單的小東西,只不過之前一直都沒有仔細看過,這兩天看了一下,不過如此嘛
來個介紹,sed本質上來說其實是乙個stream editor,是以行為單位的,主要是操作檔案再重定向到乙個地方,或者是通過管道把螢幕上的東東進行簡單的處理就ok了的東西,比起awk,perl之類的,只能算是小兒科,但是非常簡單易用的特性也使得深受廣大linuxer們喜愛。
來1、首先行號是1,$就算完了刪除直接就是d。-e選項是告訴sed,後面''內的就是要執行的指令碼了,不用-e而用-f的話,就可以把''內的東西都寫到乙個檔案中去就可以了。
比如刪除1-10行
sed -e '1,10d
' test.txt
2、替換就是s///的格式,其中的/可以換成別的符號###,===都可以。多次修改的話,用;隔開就是了,同時/value/的格式就定位了行。
比如要在每個有two的行,將1替換成2,在每個有three的行,把1替換成3
sed -e '/two/ s/1/2;/three/ s/1/3
' test.txt
3、請注意,2中例子裡面的替換,在每行中,如果有好幾個1,那麼其替換的只會是第乙個找到的1,如果想要每個都替換就要加上g這個anchor。同時由於sed不會修改檔案,那麼如果你要修改檔案的話,只能重新輸入到乙個檔案裡面,再把檔案mv回原來的檔案處才可以,這裡也可以制定行號那樣子來進行替換,而還有乙個比較重要的選項就是-n,就是不把stream顯示出來,p則可以重新顯示出來。
比如要進行3-5行,每行所有的1都要替換成2,只把3-5行顯示出來的話
sed -n -e '3,5 s/1/2/gp
' test.txt
比如在第3行後面加上1行,內容是about
sed -e '3a about
' test.txt
比如在每行的行尾加上see you這串字串
sed -e 's/^.*$/&see you/
' test.txt
行首的話,同時想寫入change.txt檔案的話
sed -e 's/^.*$/see you&/w change.txt
' test.txt
5、c是copy的意思,這裡可以用作找到pattern之後來覆蓋原來的行,注意是原來的行都不見了,直接把行給替換掉了
比如,想把檔案中所有的小寫two的行,都換成1行,每行只有two乙個單詞
sed -e '/two/c two
' test.txt
6、!代表的是去做不滿足條件的事情
比如刪除不包含two的所有行
sed -e '/two/ !d
' test.txt
7、預設sed是把檔案的所有行都讀入來進行處理的,也可以不要這麼做,加入q來提前退出
比如進行5行的替換,之後退出
sed -e 's/name/name;5q
' test.txt
接下來舉幾個比較有意思的例子
1、如何間隔的輸出奇偶行
奇行
sed -n -e 'p;n' test.txt
偶行
sed -n -e 'n;p' test.txt
稍微解釋一下n,這裡的n與前面的引數-n是不一樣的,man裡面的解釋為
需要注意的是,如果在指令碼裡用了n或者是n,比如你要處理檔案有5行,你在第2行的時候有n,那麼你要處理的檔案的第3行就會在處理第2行的時候提前被處理,第3行就不會再處理了,即是說,指令碼的內容就不會對第3行再進行一遍,只會因為在第2行的時候讀入,那麼第3行就沒了。
2、把每行第乙個單詞和最後乙個單詞交換位置
sed -e 's=^\([^a-za-z]*\)\([a-za-z][a-za-z]*\)\([^a-za-z].*\)\([^a-za-z][^a-za-z]*\)\([a-za-z][a-za-z]*\)\([^a-za-z]*\)$=\1\5\3\4\2\6=
' test.txt
有點nb,是不是?
沒啥別的了,基礎還是正則替換,剩下就是基本的一些語法,掌握了之後你就可以說你掌握了sed了
sed1 基礎知識
cat ip list.txt 1 test.sina.com.cn 2 www.sina.com.cn 3 hehe.sina.com.cn 43 haha.sina.com.cn 999 z.sina.com.cn 1 test 2 www 3 hehe 43 haha 999 z sed n ...