grep工具的功能其實還不夠強大,grep實現的只是查詢功能,而它卻不能實現把查詢的內容替換掉。vim可以查詢也可以替換,但是只侷限於在文字內部來操作,而不能輸出到螢幕上。sed和awk工具就能實現把替換的文字輸出到螢幕上的功能,而且還有其他更豐富的功能。sed和awk都是流式編輯器,是針對文件的行來操作的。
語法:sed [options] '命令' file(s)
sed [options] -f scriptfile file(s)
1.列印某行
sed -n 'n'p filename 單引號內的n是乙個數字,表示第幾行:
[root@greg-01 ~/sed]# sed -n '2'p passwd
bin:x:1:1:bin:/bin:/sbin/nologin
-n選項作用:只顯示要列印的行,無關緊要的內容不顯示
要想把所有行都列印出來可以使用 sed -n '1,$'p filename
也可以指定乙個區間: sed -n '1,3'p filename
2.列印包含某個字串的行
grep中使用的特殊字元,如 ^ $ . * 等同樣也能在sed中使用
[root@greg-01 ~/sed]# sed -n '/root/'p passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@greg-01 ~/sed]# sed -n '/r*t/'p passwd
3.-e可以實現多個行為
[root@greg-01 ~/sed]# sed -e '1'p -e '/111/'p -n sed1.txt
root:x:0:0:root:/rooot:/bin/bashlooov
11111111111111111111111111111
4.i不區分大小寫
5. 刪除某行或者多行
sed '1'd passwd
sed '1,3'd passwd
'd' 這個字元就是刪除的動作了,不僅可以刪除指定的單行以及多行,而且還可以刪除匹配某個字元的行,另外還可以刪除從某一行一直到文件末行。
不過,這個操作僅僅是在顯示螢幕上並不顯示而已,文件還好好的。
6.替換字元或字串
's' 就是替換的命令, 'g' 為本行中全域性替換,如果不加 'g' 只換該行中出現的第乙個。
sed '1,2s/ot/to/g' sed1.txt
-n選項和p命令一起使用表示只列印那些發生替換的行:
sed -n 's/ot/to/p' sed1.txt
除了可以使用 '/' 作為分隔符外,還可以使用其他特殊字元例如 '#' 或者 '@' 都沒有問題。
sed 's#ot#t*********xx#g' sed1.txt
使用正規表示式把數字替換為空,等於刪除所有數字
7.調換兩個字串的位置
用 () 把所想要替換的字元括起來成為乙個整體,因為括號在sed中屬於特殊符號,所以需要在前面加脫意字元 , 替換時則寫成 '1', ''2', ''3' 的形式。
\(..\) 用於匹配子串,對於匹配到的第乙個子串就標記為 \1,依此類推匹配到的第二個結果就是 \2。使用-r可以省略轉義字元。
除了調換兩個字串的位置外,還可以在某一行前或者後增加指定內容。
& 儲存搜尋字元用來替換其他字元,如s/love/**&**/,love這成**love**。
8.直接修改檔案的內容
直接編輯檔案選項-i,sed -i 's/ro/rorororo/g' sed1.txt
sed總結
sed元字元(正規表示式)
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。
$ 匹配行結束,如:/sed$/匹配所有以sed結尾的行。
. 匹配乙個非換行符的任意字元,如:/s.d/匹配s後接乙個任意字元,最後是d。
* 匹配0個或多個字元,如:/*sed/匹配所有模板是乙個或多個空格後緊跟sed的行。
匹配乙個指定範圍內的字元,如/[ss]ed/匹配sed和sed。
[^] 匹配乙個不在指定範圍內的字元,如:/[^a-rt-z]ed/匹配不包含a-r和t-z的乙個字母開頭,緊跟ed的行。
\(..\) 匹配子串,儲存匹配的字元,如s/\(love\)able/\1rs,loveable被替換成lovers。
& 儲存搜尋字元用來替換其他字元,如s/love/**&**/,love這成**love**。
\< 匹配單詞的開始,如:/\ 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。
x\ 重複字元x,m次,如:/0\/匹配包含5個0的行。
x\ 重複字元x,至少m次,如:/0\/匹配至少有5個0的行。
x\ 重複字元x,至少m次,不多於n次,如:/0\/匹配5~10個0的行。
練習:
把/etc/passwd 複製到/sed/passwd,用sed列印所有行
列印passwd的3到10行
sed -n '3,10'p passwd
列印passwd 中包含 『root』 的行
sed -n '/root/'p passwd
刪除passwd 的15行以及以後所有行
sed '15,$'d passwd
刪除passwd中包含 『bash』 的行
sed '/bash/'d passwd
替換passwd 中 『root』 為 『toor』
sed 's/root/toor/g' passwd
替換passwd中 『/sbin/nologin』 為 『/bin/login』
sed 's#sbin/nologin#bin/login#g' passwd
刪除passwd中5到10行中所有的數字
sed '5,10s/[0-9]//g' passwd
刪除passwd 中所有特殊字元(除了數字以及大小寫字母)
sed 's/[^0-9a-za-z]//g' passwd
把passwd中第乙個單詞和最後乙個單詞調換位置
sed 's/\(^[a-za-z][a-za-z]*\)\([^a-za-z].*\)\([^a-za-z]\)\([a-za-z][a-za-z]*$\)/\4\2\3\1/' passwd
把passwd中出現的第乙個數字和最後乙個單詞替換位置
sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-za-z]\)\([a-za-z][a-za-z]*$\)#\1\5\3\4\2#' passwd
把passwd 中第乙個數字移動到行末尾
sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' passwd
在passwd 20行到末行最前面加 『aaa:』
sed 's/^.*$/&aaa/' passwd
Linux正規表示式 編寫正規表示式
為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...
L1正規表示式與L2正規表示式
一 奧卡姆剃刀 occam s razor 原理 在所有可能選擇的模型中,我們應選擇能夠很好的解釋資料,並且十分簡單的模型。從貝葉斯的角度來看,正則項對應於模型的先驗概率。可以假設複雜模型有較小的先驗概率,簡單模型有較大的先驗概率。二 正則化項 2.1 什麼是正則化?正則化是結構風險最小化策略的實現...
正規表示式 Linux
主要內容 1 正規表示式2 基礎3 擴充套件4 通配5 grep命令 正規表示式基礎 1 元字元 metacharacters 是用來闡釋字元表示式意義的字元,簡言之,元字元就是描述字元的字元,它用於對字元表示式的內容 轉換及各種操作資訊進行描述。正規表示式是由一串字元和元字元構成的字串,簡稱re ...