Shell之sed文字處理

2021-10-23 01:28:22 字數 4255 閱讀 7786

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