打印文本: sed -n 'p' test.txt 若是不加-n,則每行都重複。正則表達式
定位一行:3d
[root@iZryxshkbkz2x2Z ~]# sed -n '5p' test.txt ddddddd root dafdadf
也能夠用正則匹配(使用正則時必定要用// 把正則表達式包裹起來):code
root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '/\(ddddddddd\)\+/p' dddddddddddrootfdaxcmkadfakdsmflakd
定位多行:blog
root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '2,4p' 2 dddddddddddrootfdaxcmkadfakdsmflakd 3 testfkdlkfaldkfl;akccccccccccccccccdadfac 4 fdafacdfadsssssssssfdasfasfroot
用正則實現:不知道爲啥不行,明天看看字符串
取反:使用!io
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '2,4!p' 1 root 122222222222 dddddddaaa 5 ddddddd root dafdadf
行間隔: first~step : 錯誤理解: 從first 行開始跳過step-1 行test
重點: 看結果理解。sed
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '1~2p' # c 1 root 122222222222 dddddddaaa 3 testfkdlkfaldkfl;akccccccccccccccccdadfac 5 ddddddd root dafdadf
在第一行和第二行後添加 '=======' [root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '1,2a=========='
1 root 122222222222 dddddddaaa ========== 2 dddddddddddrootfdaxcmkadfakdsmflakd ========== 3 testfkdlkfaldkfl;akccccccccccccccccdadfac 4 fdafacdfadsssssssssfdasfasfroot 5 ddddddd root dafdadf配置
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2i==========' # 在第二行開頭插入===,至關於1a==== 1 root 122222222222 dddddddaaa ========== 2 dddddddddddrootfdaxcmkadfakdsmflakd 3 testfkdlkfaldkfl;akccccccccccccccccdadfac 4 fdafacdfadsssssssssfdasfasfroot 5 ddddddd root dafdadf
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2c======' # 用 ======= 替代第二行 1 root 122222222222 dddddddaaa ====== 3 testfkdlkfaldkfl;akccccccccccccccccdadfac 4 fdafacdfadsssssssssfdasfasfroot 5 ddddddd root da [root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2,4c======' # 替換多行 1 root 122222222222 dddddddaaa ====== 5 ddddddd root dafdadf
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2d' 1 root 122222222222 dddddddaaa 3 testfkdlkfaldkfl;akccccccccccccccccdadfac 4 fdafacdfadsssssssssfdasfasfroot 5 ddddddd root dafdadf
在配置文件後追加配置: sed '$a \ access no \n operration no' test.txt // $表明: 最後一行。 第一個斜槓表明間隔符,要不緊跟的空格不起做用。im
刪除文本中的空行:sed '/^$/d' test.txt [root@iZryxshkbkz2x2Z ~]# sed '/^$/d' test.txt
注意s 替換與c 的區別,c 是替換行的。
替換字符串 和被替換字符串 記得先後加 /.
[root@iZryxshkbkz2x2Z ~]# sed 's/root/root2/' test.txt root2 122222222222 dddddddaaa dddddddddddroot2fdaxcmkadfakdsmflakd testfkdlkfaldkfl;akccccccccccccccccdadfac fdafacdfadsssssssssfdasfasfroot2 ddddddd root2 dafdadf
g 參數表明全局參數,若是不加g 則只替換每一行的第一個匹配的。
[root@iZryxshkbkz2x2Z ~]# sed 's/root/root2/' test.txt root2 rootaaaa2222222 dddddddaaa fdafacdfadsssssssssfdasfasfroot2 root2dddddddrootdafdadfroot [root@iZryxshkbkz2x2Z ~]# sed 's/root/root2/g' test.txt root2 root2aaaa2222222 dddddddaaa fdafacdfadsssssssssfdasfasfroot2 root2dddddddroot2dafdadfroot2
場景: 實現間隔行(還能夠用first~step 實現): nl test.txt | sed -n '{n;p}':
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '{n;p}' 2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 4 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 6 ccccccccccccccccccccccccccccccc
nl test.txt | sed -n '{p;n}':
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '{p;n}' 1 root rootaaaa2222222 dddddddaaa 3 fdafacdfadsssssssssfdasfasfroot 5 rootdddddddrootdafdadfroot 7 dddddddddddddddddddddddddd
好比: sed '/root/&3/s' test.tet 等價於 sed 's/root/root3/' test.txt
[root@iZryxshkbkz2x2Z ~]# sed 's/root/&3/g' test.txt # 等價於 sed 's/root/root3/g' test.txt root3 root3aaaa2222222 dddddddaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa fdafacdfadsssssssssfdasfasfroot3 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb root3dddddddroot3dafdadfroot3 ccccccccccccccccccccccccccccccc dddddddddddddddddddddddddd
案例1: 在root 後添加冒號:
sed 's/root/& : /g' test.txt:
[root@iZryxshkbkz2x2Z ~]# sed 's/root/& : /g' test.txt root : root : aaaa2222222 dddddddaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa fdafacdfadsssssssssfdasfasfroot : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb root : dddddddroot : dafdadfroot : ccccccccccccccccccccccccccccccc dddddddddddddddddddddddddd
案例二: 將root 首字母轉爲大寫:
sed 's/root/\u&/g' test.txt
[root@iZryxshkbkz2x2Z ~]# sed 's/root/\u&/g' test.txt Root Rootaaaa2222222 dddddddaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa fdafacdfadsssssssssfdasfasfRoot bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb RootdddddddRootdafdadfRoot ccccccccccccccccccccccccccccccc dddddddddddddddddddddddddd
案例三: 將txt文件首字母轉換爲大寫:
ls *.txt | sed 's/\w+/\u&/'
[root@iZryxshkbkz2x2Z ~]# ls *.txt | sed 's/\w\+/\u&/' Ip.txt Test.txt
案例1: 提取passwd 中的用戶名,UID,GROUPID:
注意: .* :懶惰匹配
[root@iZryxshkbkz2x2Z ~]# sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\).*$/ \1 \2 \3/ ' passwd root 0 0 bin 1 1 daemon 2 2 adm 3 4 lp 4 7 sync 5 0 shutdown 6 0 halt 7 0
.* :懶惰匹配 \1 \2 \3 : 匹配的內容
** 案例2 **
提取ifconfig eth0 中的第二行
[root@iZryxshkbkz2x2Z ~]# ifconfig eth0 | sed -n '/inet/p' |sed 's/ine.r:([0-9.]+) .$/\1/'
把abc 的內容寫入 123.txt 內容的第一行。(abc.txt 和 123.txt 自己並無變化)
[root@iZryxshkbkz2x2Z ~]# sed '1r abc.txt' 123.txt 1111111111111 aaaaaaa bbbbbbbbbbbbbbb cccccccccccccc 222222222222 33333333333333
把 123.txt 第一行的內容寫入abc.txt
[root@iZryxshkbkz2x2Z ~]# sed '1w abc.txt' 123.txt