命令格式解析 1.常見命令選項 -n 屏蔽預設輸出 -i 直接修改文本內容 -f 使用sed腳本 -e 可指定多個處理動作 -r 啟用擴展正則表達式,若與其他選項一起使用,應把r放在最前 -{} 可組合多個命令,以分號分割 基本的處理動作 替換操作的分隔符"/"可以用其他字元代替,如&,#,便於修改 ...
命令格式解析
1.常見命令選項
-n 屏蔽預設輸出
-i 直接修改文本內容
-f 使用sed腳本
-e 可指定多個處理動作
-r 啟用擴展正則表達式,若與其他選項一起使用,應把r放在最前
-{} 可組合多個命令,以分號分割
基本的處理動作
p | 列印行 | 4,6p 輸出4,5,6行 |
4p,6p 輸出4行,6行 | ||
d | 刪除行 | 4,6d 刪除4,5,6行 |
s | 字元串替換 | s/old/new/ 將每行的第一個old替換成new |
s/old/new/3 將每行的第三個old替換成new | ||
s/old/new/g 將全部的old替換成new |
替換操作的分隔符"/"可以用其他字元代替,如&,#,便於修改文件路徑
輸出文本 | |
sed -n 'p' aa.txt | 輸出書有行,相當於cat aa.txt相同 |
sed -n '6p' aa.txt | 輸出第6行 |
sed -n '4,7p' aa.txt | 輸出4,5,6,7行 |
sed -n '4,+5p' aa.txt | 輸出第4行以及其後的5行 |
sed -n '/^root/p' aa.txt | 輸出以root開頭的行 |
sed -n 'p,n' aa.txt | 輸出奇數行,n表示讀取下一行文本 |
sed -n 'n,p' aa.txt | 輸出偶數行,n表示讀取下一行文本 |
sed -n '5,${n,p}' aa.txt | 輸出從第五行至文件末尾的所有偶數行 |
sed -n '$=' aa.txt | 輸出文件的行數 |
刪除文本 | |
sed -n '4,7d' aa.txt | 刪除4,5,6,7行 |
sed -n '/bin/d' aa.txt | 刪除包含bin的行 |
sed -n '/bin/!d' aa.txt | 刪除不包含bin的行,!表示取反 |
sed -n '/^bin/d' aa.txt | 刪除以bin開頭的行 |
sed -n '/^$/d' aa.txt | 刪除所有空行 |
sed -n '/^$/{n;/^$/d}' aa.txt | 刪除重覆空行,連續的空行只保留一個 |
替換文本 | |
sed -n 's/aa/AA/' aa.txt | 將每行中的第一個aa替換成AA |
sed -n 's/aa/AA/4' aa.txt | 將每行中的第4個aa替換成AA |
sed -n 's/aa/AA/g' aa.txt | 將文本所有的aa替換成AA |
sed -n 's/aa//g' aa.txt | 將文本所有的aa替換成空,相當於刪除 |
sed -n 's/aa/&s/g' aa.txt | 將文本所有的aa替換成aas,&表示查找到的字元 |
sed -n '4,6s/^/#/' aa.txt | 將文本4,5,6行的開頭加上#,相當於註釋代碼 |
sed -n '4,6s/^#//' aa.txt | 將文本4,5,6行的開頭#號去掉,相當於刪除註釋 |
sed的文本塊處理
操作符 | 用途 | 命令示範 |
i | 行前插入文本 | 2iAA,在第2行前面插入文本行AA |
2,4iAA,在第2-4行每行前面插入文本行AA | ||
a | 行後插入文本 | 2aAA,在第2行後面插入文本行AA |
2,4aAA,在第2-4行每行後面插入文本行AA | ||
c | 替換當前行 | 2cAA,把第二行內容替換成AA |
導入到處操作
操作符 | 用途 | 命令示範 | 解釋 |
r | 讀取文本 | 2r a.txt | 在第2行的下麵插入a.txt文件 |
2,4r a.txt | 在第2-4行每行下麵插入a.txt文件 | ||
w | 保存到文件 | 2w a.txt | 將第2行的內容保存為a.txt文件 |
2,4w a.txt | 將第2-4行的內容保存為a.txt文件 |
sed複製剪切
模式空間
-存放當前處理的行,將處理的結果輸出
-若當前行不符合處理條件,則原樣輸出
-處理完當前行再讀入下一行進行處理
保持空間
-類似於windows的剪切板
-預設存放一個空行(換行符 \n)
基本動作
複製
H:模式空間--->追加--->保持空間
h:模式空間--->覆蓋--->保持空間
粘貼
G:保持空間--->追加--->模式空間
g:保持空間--->覆蓋--->模式空間
示範
1)把1-3行複製到文件末尾
[root@localhost ~]# cat a.txt 111 222222 333333333 444444444444 [root@localhost ~]# sed '1,3H;$G' a.txt #此處有空行時因為第一次是在保持空間里追加,而保持空間預設有一個空行,註意理解H和h,G和g的區別 111 222222 333333333 444444444444 111 222222 333333333 [root@localhost ~]# sed '1h;2,3H;$G' a.txt #此處沒有空行,因為第一次是覆蓋保持空間的空行 111 222222 333333333 444444444444 111 222222 333333333
2)把第一行剪切到文件末尾
[root@localhost ~]# sed '1h;1d;$G' a.txt 222222 333333333 444444444444 111
3)把第1,2行剪切到文件末尾
[root@localhost ~]# sed '1h;2H;1,2d;$G' a.txt 333333333 444444444444 111 222222
!取反操作
1)列出不使用bash的用戶有哪些
[root@localhost ~]# sed -n '/bash$/!p' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
修改啟動項
[root@localhost ~]# sed '/^id/s/[0-6]/3/g' /etc/inittab
id:3:initdefault:
其他複雜使用
1)刪除文件中每行的第二個、最後一個字元
分兩次替換操作,第一次替換掉第2個字元,第二次替換掉最後一個字元:
[root@localhost ~]# sed 's/.//2;s/.$//' a.txt
2)刪除文件中每行的第二個、最後一個單詞
分兩次替換操作,第一次替換掉第2個單詞,第二次替換掉最後一個單詞:
[root@localhost ~]# sed -r 's/[a-Z]+//2;s/[a-Z]+([^a-Z]*)$/\1/' a.txt
3)將文件中每行的第一個、第二個字元互換
每行文本拆分為“第1個字元”、“第2個字元”、“剩下的所有字元”三個部分,然後通過替換操作重排順序為“2-1-3”:
[root@localhost ~]# sed -r 's/^(.)(.)(.*)/\2\1\3/' a.txt
4)將文件中每行的第一個、第二個單詞互換
每行文本拆分為“第1個單詞”、“單詞分隔”、“第2個單詞”、“剩下的所有字元”四個部分,然後通過替換操作重排順序為“3-2-1-4”:
[root@localhost ~]# sed -r 's/([a-Z]+)([^a-Z]*)([a-z]+)(.*)/\3\2\1\4/' a.txt
5)刪除文件中所有的數字、行首的空格
因原文件內沒有數字,行首也沒有空格,這裡稍作做一點處理,生成一個新測試文件:
[root@localhost ~]# sed 's/o/o7/;s/l/l4/;3,5s/^/ /' a.txt > b.txt
6)刪除所有數字、行首空格的操作
[root@localhost ~]# sed -r 's/[0-9]//g;s/^( )+//' a.txt
7)為文件中每個大寫字母添加括弧
使用“&”可調用s替換操作中的整個查找串,所以可參考下列操作解決:
[root@localhost ~]# sed 's/[A-Z]/(&)/g' a.txt
或者
[root@localhost ~]# sed -r 's/([A-Z])/(\1)/g' a.txt