L27 linux正規表示式 sed用法詳解

2021-08-09 22:45:48 字數 4508 閱讀 1779

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