知識湧公升 sed我來啦

2022-05-08 08:27:11 字數 2203 閱讀 7028

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 ...