sed基本用法:作用/格式/定址方式
sed過濾指令:常見的處理動作
文字塊處理:插入/替換行、多行文字
stream editor,流式編輯器
非互動,基於模式匹配過濾及修改文字
逐行處理,並將結果輸出到螢幕
可實現對文字的輸出、刪除、替換、複製、剪下、匯入、匯出等各種操作(vim無法在指令碼中使用)
語法格式:
#定址符->[位址1,[位址2]]
示例:
$ grep ^s /etc/passwd
root:x:0:0:root:/root:/bin/bash
$ sed -n '/^r/p' /etc/inittab
root:x:0:0:root:/root:/bin/bash #列出以r開頭的行
常見命令選項
-n: 遮蔽 預設輸出全部文字 -> 只輸出與條件匹配的結果
-i: 直接修改檔案內容
-e: 可指定多個處理動作
-r: 啟用擴充套件的正規表示式,若與其他選項一起使用,應作為首個選項
{}: 可組合多個命令,以分號分隔
定址符,即[位址1,[位址2]]
用來指定處理的起、止行數(起始位置、結束位置)
省略定址符時,預設逐行處理全部文字
位址可表示為文字的「行號」,或者用來匹配的「/正規表示式/」
示例:
$ sed -n '2,4p' /etc/hosts //輸出第2-4行
$ that require network functionality willfail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localhost6 localhost6
1.處理動作
操作符用途指令示例
p列印行
2,4p 輸出2、3、4行
2p;4p 輸出第2行、第4行
d刪除行
2,4d 輸出第2、3、4行
s字串替換
s/old/new/ 將每行的第1個old替換為new
s/old/new/g 將所有的old都替換為new
[注]替換操作的分隔符「/」可改用其他字元,如#、&等,便於修改檔案路徑(適用場景:old串中包含檔案路徑、避免混淆)
2.處理動作-列印示例
含**析
sed -n 『p』 a.txt
輸出所有行,等同於cat a.txt
sed -n 『4p』 a.txt
輸出第4行
sed -n 『4,+10p』 a.txt
輸出第4行及其後的10行內容
sed -n 『/^bin/p』 a.txt
輸出以bin開頭的行
sed -n 『p;n』 a.txt
輸出奇數行,n表示讀入下一行文字(隔行)
sed -n 『n;p』 a.txt
輸出偶數行,n表示讀入下一行文字(隔行)
sed -n 『$=』 a.txt
輸出檔案的行數
3.處理動作-刪除示例
含**析
sed 『3,5d』 a.txt
刪除第3-5行
sed 『/xml/d』 a.txt
刪除所有包含xml的行
sed 『/xml/!d』 a.txt
刪除不包含xml的行,!符號表示取反
sed 『$d』 a.txt
刪除檔案的最後一行
sed 『/^$/d』 a.txt
刪除所有空行
sed 『/^$/』 a.txt
刪除重複空行,連續兩個空行只保留乙個
[注]此例中只作輸出,不更改原檔案(若需要更改,應新增選項-i)
4.處理動作-替換示例
含**析
sed 『s/xml/xml/』 a.txt
將每行中第乙個xml替換為xml
sed 『s/xml/xml/3』 a.txt
將每行中的第三個xml替換為xml
sed 『s/xml/xml/g』 a.txt
將所有的xml都替換為xml
sed 『s/xml//g』 a.txt
將所有的xml都刪除(替換為空串)
sed 『s/doc/&s/g』 a.txt
將所有的doc都替換為docs,&代表查詢串
sed 『4,7s/^/#/』 a.txt
將第4-7行注釋掉(行首加#號)
sed 『s/^#an/an/』 a.txt
接觸以#an開頭的行的注釋(去除行首的#號)
[注]此例中只作輸出,不更改原檔案(若需要更改,應新增選項-i)
5.sed實際應用1
# 修改前
$ sed -i 's#/var/www/html#/opt/wwwroot' \
/etc/httpd/conf/httpd.conf # 修改操作;#號為分隔符,避免與路徑分隔符混淆
# 修改後
1.sed文字塊處理1
操作符用途指令示例
含**釋
i行前插入文字
2iyy
在第2行之前新增文字行
4,7iyy
在第4-7行的每一行前新增文字行
a行後插入文字
2ayy
在第2行之後新增文字
/^xx/ayy
在以xx開頭的行之後新增文字
c替換當前行
2cyy
將第2行的內容修改為"yy"
2.sed文字塊處理2
$ cat m.txt
1111111 helloshell
22222 it group
$ sed
'2ixx' m.txt
1111111 helloshell
xx # 輸入到行前
22222 it group
$ sed
'2axx' m.txt
1111111 helloshell
222 it group
xx # 插入到行後
$ sed
'2cxx' m.txt
1111111 helloshell
xx # 替換指定行
3.多行文字處理
修改後的文字有多行時: 以換行符\n分隔
或,使用\強制換行(互動式)
$ sed -n '2cxx\nyy' m.txt
xxyy
$ sed -n '2cxx\
> yy' m.txt
xxyy
4.sed行替換 實際應用——修改主機名
找到主機名配置檔案中的hostname行
整行替換為新的主機名設定
$ grep ^hostname /etc/sysconfig/network
hostname=svr5.hiai.com # 修改前
$ sed -i '/^hostname/chostname=mysvr.hi\
ai.com' /etc/sysconfig/network # 整行替換操作
$ grep ^hostname /etc/sysconfig/network
hostname=mysvr.hiai.com # 修改後
文字處理之SED
高階編輯命令 stream editor,行編輯器 sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時 緩衝區中,稱為 模式空間 pattern space 接著用sed命令處理緩衝區中的 內容,處理完成後,把緩衝區的內容送往螢幕。然後讀入下行,執行下乙個迴圈。如果沒有使諸如...
linux 文字處理sed
ed與sed的區別 sed是從ed發展來的,ed是針對當前行進行操作 sed是面向字元流的。sed和ed的應用定址有很大的區別。在ed中沒有指定位址的命令只影響當前行。sed遍歷檔案,每次讀取一行,這樣每行都是當前行,每行都應用這個命令,結果是sed對檔案中的每一行都應用了ed中沒有位址的命令。如s...
文字處理sed 實踐
利用sed 取出ifconfig命令中本機的ipv4位址 root oracle ifconfig eth7 eth7 link encap ethernet hwaddr 00 50 56 85 6e a1 inet addr 192.168.97.164 bcast 192.168.99.255...