sed

sed

做用:主要用於替換指定的字符;查找或替換指定字符串時,必須把字符串用//來註釋下,好比root 必須是/root/;
sed 只要不用-i參數,通常都是在輸出終端上顯示而已,沒法更改源文件;
express

參數-e: --expression,多重編輯;
參數-n:不帶-n則列出文件全部內容,加上-n只列出匹配的那一行;
參數-i:直接修改讀取的內容文件,而不是輸出到終端;
參數-r:可讓特殊字符不用加轉義符脫義
功能I:忽略查詢字符的大小寫 ‘/ /’Ip
功能s:替換、取代;
功能g:本行全局替換;
功能d:刪除;
功能a:新增;bash

查找

打印指定某行
sed -n 'n'p filename
引號n表明數字,第幾行,p爲打印意思;

例如只打印第2行ide

[root@jinkai01 sed]# sed -n '2'p passwd
bin:x:1:1:bin:/bin:/sbin/nologincode

打印包含某個字符串的行
sed -n '/root/'p filename
root 表明字符串,將包含root的行打印出來
文檔

[root@jinkai01 sed]# sed -n '/root/'p passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin字符串

包含特殊字符用法it

#打印以1 爲開頭的行****io

sed -n '/^1/'p passwd class

#打印以 in 結尾的行test

sed -n '/in$/'p passwd

#打印包含r 和 o 之間有零個或一個的任意字符的行

sed -n '/r.o/'p passwd

#打印包含oo後面有零個或多個o的行

sed -n '/ooo*/'p passwd

#sed命令加上-e選項能夠實現多個行爲

sed -e '1'p -e '/111/'p -n passwd
打印出第一行和包含111字符的全部行

替換

替換字符或者字符串
參數s就表示替換的動做;
參數g表示本行全局替換,若是不加g則只替換本行出現的第
一個;
指定替換一行或多行內的字符,不加數字就是替換文檔所有,$表示結尾,^表示開頭;

實驗:把passwd文檔的第1行和第2行的root換成aaa且打印出來

[root@jinkai01 sed]# sed '1,2s/root/aaa/g' passwd
aaa:x:0:0:aaa:/aaa:/bin/bash

替換文檔內的所有數字或字母爲空

實驗:把passwd 文檔內的全部字母替換爲空
[root@jinkai01 sed]# sed 's/[a-zA-Z]//g' passwd
::0:0::/://
::1:1::/://

替換字母大小寫
sed中,使用\u表示大寫,\l表示小寫

  1. 把文件中每一個單詞的第一個小寫字母變大寫:

    sed 's/\b[a-z]/\u&/g' filename

  2. 把文件中全部字母小寫變大寫:

    *sed 's/[a-z]/\u&/g' filename

  3. 把文件中因此字母大寫變小寫:

    sed 's/[A-Z]/\l&/g' filename

刪除

d:刪除動做。
這裏參數d表示刪除的動做,它不只能夠刪除指定的單行以及多行,並且能夠刪除匹配某個字符的行,還能夠刪除從某一行開始到文檔最後一行的全部行。
這個刪除操做僅僅是顯示在屏幕上,原文檔並無影響。

實驗:刪除passwd內包含root的行

[root@jinkai01 sed]# sed '/root/'d passwd

實驗:刪除passwd 文檔的第1行

[root@jinkai01 sed]# sed '1'd passwd

實驗:刪除passwd 文檔的第1行到第3行

[root@jinkai01 sed]# sed '1,3'd passwd

調換

調換兩個字符串的位置
-r 參數:能夠不用加轉義符\ 去脫義特殊字符

實驗:把passwd文檔內的root 和bin調換位置

[root@jinkai01 sed]# sed -r 's/(root)(.*)(bin)/\3\2\1/' passwd

實驗:把passwd文檔內的第一列和最後一列作調換

[root@jinkai01 sed]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon

實驗:在某一行先後增長指定內容
在每一行最後面加上:aaa

sed -r 's/([^:]+$)/\1:aaa/' passwd
或sed -r 's/(.*)/\1:aaa/' passwd

在每一行最前面加上aaa:

sed -r 's/(.*)/aaa:\1/' passwd
或sed -r 's/([^:]+)/aaa:\1/' passwd

直接修改文件內容

將passwd 文檔裏面的ot 所有替換爲 to,不打印到屏幕,真實改變文件自己

[root@jinkai01 sed]# sed -i 's/ot/to/g' passwd
[root@jinkai01 sed]# head -3 passwd
roto:x:0:0:roto:/roto:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 
 




課後習題
(1) 把/etc/passwd複製到/root/test.txt,用sed打印全部行。

sed -n '1,$'p test.txt

(2) 打印test.txt的第3行~第10行。

sed -n '3,10'p test.txt

(3) 打印test.txt中包含root的行。

sed -n '/root/'p test.txt

(4) 刪除test.txt的第15行以及後面的全部行。

sed '15,$'d test.txt

(5) 刪除test.txt中包含bash的行。

sed '/bash/'d test.txt

(6) 將test.txt中的root替換爲toor。

sed 's/root/toor/g'p test.txt

(7) 將test.txt中的/sbin/nologin替換爲/bin/login。

sed 's#sbin/nologin#bin/login#g'p test.txt

(8) 刪除test.txt中第5行~第10行中全部的數字。

sed '5,10s/[0-9]//g'p test.txt

(9) 刪除test.txt中全部的特殊字符(除了數字以及大小寫字母)。

sed 's/[^0-9a-zA-Z]//g'p test.txt

(10) 把test.txt中第一個單詞和最後一個單詞調換位置。

sed -nr 's/([a-zA-Z]+)([^a-zA-Z].*[^a-zA-Z])([a-zA-Z]+)/\3\2\1/'p test.txt

(11) 把test.txt中出現的第一組數字(1個或多個)和最後一個單詞調換位置。

sed -nr 's/(^[^0-9])([0-9]+)([^0-9].*[^a-zA-Z])([a-zA-Z]+$)/\1\4\3\2/g'p test.txt
或者sed -nr 's/([0-9]+)([^0-9].*[^a-zA-Z])([a-zA-Z]+)/\3\2\1/'p

(12) 把test.txt中第一個數字移動到本行末尾。

sed -nr 's/(^[^0-9] )([0-9]+)([^0-9].*$)/\1\3\2/'p test.txt 一組數字
或sed -nr 's/([0-9])(.)([^0-9].*$)/\3\2\1/'p 單個數字

(13) 在test.txt第20行到最後一行最前面加aaa:。

sed '20,$s/^.*$/aaa:&/'p test.txt

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息