Sed進階用法
一、sed命令介紹
sed 是 stream editor 的縮寫,中文稱之為“流編輯器”。
sed 命令是一個面向行處理的工具,它以“行”為處理單位,針對每一行進行處理,處理后的結(jié)果會輸出到標準輸出(STDOUT)。你會發(fā)現(xiàn) sed 命令是很懂禮貌的一個命令,它不會對讀取的文件做任何貿(mào)然的修改(除非加上-i選項),而是將內(nèi)容都輸出到標準輸出中。
-
sed命令的語法:sed command file
- command 部分:針對每行的內(nèi)容所要進行的處理(這部分很重要很重要)。
- file 部分:要處理的文件,如果忽略 file 參數(shù),則 sed 會把標準輸入作為處理對象。
-
sed命令的選項與參數(shù):
-n : 使用靜默模式,在一般的sed的用法中,所有來自stdin(標準輸出)的數(shù)據(jù)一般都會被列出到屏幕上。
但如果加上-n參數(shù)后,則只要經(jīng)過sed特殊處理的那行才會被列出來。
-e : 直接在命令行模式上進行sed的操作編輯
-f : 直接將sed的操作寫在一個文件內(nèi),-f filename則可以執(zhí)行filename內(nèi)的sed操作
-r : 使用擴展正則表達式的語法
-i : 直接修改文件內(nèi)容,而不是輸出到屏幕上
command說明:[n1][,n2] action
n1,n2 : 一般代表【選擇進行操作(action)的行數(shù)】,舉例:如果我的操作是需要在
5行到20行之間進行的,則【5,20[action]】。
action的參數(shù):
單行模式空間
a : 新增。a的后面接字符,而這些字符會在新增到下一行
i : 插入。i的后面接字符,而這些字符會在新增到上一行
c : 替換。c的后面接字符,這些字符替換n1到n2的行
d : 刪除。因為是刪除,所以d后面通常不接任何東西
p : 打印。將匹配的數(shù)據(jù)打印出來。通常p會與選項-n一起使用
s : 替換。將文件原內(nèi)容替換為新內(nèi)容。舉例:s/lod/new/g
n : 讀取匹配的數(shù)據(jù)的下一行,覆蓋模型空間的前一行(也就是被匹配的行),結(jié)果交給下一個參數(shù)處理
多行模式空間
N : 讀取匹配的數(shù)據(jù)的下一行追加到模式空間,同時將兩行看做一行,但是兩行之間依然含有\(zhòng)n換行符
P : 打印。打印模式空間開端至\n(換行)之間的內(nèi)容,并追加到默認輸出之前。
D : 如果模式空間包含換行符,則刪除模式空間開端至\n(換行)之間的內(nèi)容, 并不會讀取新的輸入行,
而使用合成的模式空間重新啟動循環(huán)。如果模式空間不包含換行符,則會像發(fā)出d命令那樣啟動正常的新循環(huán)
替換標記
g 表示行內(nèi)全面替換。
p 表示打印行。
w 表示把行寫入一個文件。
x 表示互換模板塊中的文本和緩沖區(qū)中的文本。
y 表示把一個字符翻譯為另外的字符(但是不用于正則表達式)
\\1 子串匹配標記
& 已匹配字符串標記
其它
! 表示后面的命令對所有沒有被選定的行發(fā)生作用。
= 打印當前行號碼。
# 把注釋擴展到下一個換行符以前。
二、sed 的工作原理與流程
工作原理:
sed 命令是面向“行”進行處理的,每一次處理一行內(nèi)容。處理時,sed 會把要處理的行存儲在緩沖區(qū)中,接著用 sed 命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。這個緩沖區(qū)被稱為“模式空間”(pattern space)。在這個處理過程中,sed 命令并不會對文件本身進行任何更改。
工作流程:
主要包括讀取、執(zhí)行和顯示三個過程。
- 讀?。簊ed 從輸入流(文件、管道、標準輸入)中讀取一行內(nèi)容并存儲到臨時的緩沖區(qū)中(又稱模式空間,pattern space)。
- 執(zhí)行:默認情況下,所有的 sed 命令都在模式空間中順序地執(zhí)行,除非指定了行的地址,否則 sed 命令將會在所有的行上依次執(zhí)行。
- 顯示:發(fā)送修改后的內(nèi)容到輸出流。在發(fā)送數(shù)據(jù)后,模式空間將會被清空。在所有的文件內(nèi)容都被處理完成之前,上述過程將重復執(zhí)行,直至所有內(nèi)容被處理完。
2.1 模式空間與保持空間
**模式空間(pattern space):**sed處理文本內(nèi)容行的一個臨時緩沖區(qū),模式空間中的內(nèi)容會主動打印到標準輸出,并自動清空模式空間
**保持空間(hold space):**sed處理文本內(nèi)容行的另一個臨時緩沖區(qū),不同的是保持空間內(nèi)容不會主動清空,也不會主動打印到標準輸出,而是需要sed命令來進行處理
模式空間與保持空間的關(guān)系:
**模式空間:**相當于流水線,文本行在模式空間中進行處理;
**保持空間:**相當于倉庫,在模式空間對數(shù)據(jù)進行處理時,可以把數(shù)據(jù)臨時存儲到保持空間;作為模式空間的一個輔助臨時緩沖區(qū),但又是相互獨立,可以進行交互,命令可以尋址模式空間但是不能尋址保持空間??梢允褂酶呒壝頷,H,g,G與模式空間進行交互。
模式空間與保持空間進行交互:文章來源:http://www.zghlxwxcb.cn/news/detail-641444.html
d : 刪除模式空間的內(nèi)容,開始下一個循環(huán)
D : 刪除模式空間/n(換行符)前面的內(nèi)容
h : 【復制】模式空間的內(nèi)容至保持空間(會覆蓋保持空間的原內(nèi)容)
H : 把模式空間的內(nèi)容【追加】至保持空間
g : 【復制】保持空間的內(nèi)容至模式空間(會覆蓋模式空間的原內(nèi)容)
G : 把保持空間的內(nèi)容【追加】至模式空間
x : 【交換】模式空間與保持空間的內(nèi)容
三、sed命令演示
**注意!**以下的演示都未加-i
,所以對實際文件內(nèi)容不產(chǎn)生任何效果。文章來源地址http://www.zghlxwxcb.cn/news/detail-641444.html
#使用sed命令對該文件進行演示
[root@localhost ~]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
=======================================
#用a參數(shù)在第一行的下面插入test
[root@localhost ~]# sed '1atest' passwd
root:x:0:0:root:/root:/bin/bash
test
bin:x:1:1:bin:/bin:/sbin/nologin
#用i參數(shù)在第二行的上面插入hello
[root@localhost ~]# sed '2ihello' passwd
root:x:0:0:root:/root:/bin/bash
hello
bin:x:1:1:bin:/bin:/sbin/nologin
#用c參數(shù)把第二行替換為hello
[root@localhost ~]# sed '2chello' passwd
root:x:0:0:root:/root:/bin/bash
hello
#用d參數(shù)刪除匹配到‘root’的行
[root@localhost ~]# sed '/root/d' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
#單獨用s參數(shù)替換文件內(nèi)容只會替換該行匹配到的第一個
[root@localhost ~]# sed 's/root/tom/' passwd
tom:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
#s和g搭配使用可達到替換全部匹配到的效果
[root@localhost ~]# sed 's/root/tom/g' passwd
tom:x:0:0:tom:/tom:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
#單獨使用p參數(shù)可以看到不僅打印出匹配‘root’的行,還把原本內(nèi)容 \
#一起顯示出來了,這是因為sed的特性,文章開頭的一段話就說明了。
[root@localhost ~]# sed '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
#通常p參數(shù)會搭配-n選項一起使用,-n是靜默模式
[root@localhost ~]# sed -n '/root/p' passwd
root:x:0:0:root:/root:/bin/bash
#使用y參數(shù)進行大小寫轉(zhuǎn)換
[root@localhost ~]# sed 'y/abdef/ABDEF/' test
A FriEnD is somEonE
with whom you
DArE to BE yoursElF.
[root@localhost ~]# sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' test
A FRIEND IS SOMEONE
WITH WHOM YOU
DARE TO BE YOURSELF.
#用n參數(shù)讀取當前行(匹配到的行)的下一行至模式空間,n參數(shù)會覆蓋模式空間的 \
#前一行(也就是含有'root'的行)。此時模式空間只有‘下一行’,后面的d參數(shù)會 \
#刪除模式空間的內(nèi)容,所以sed會打印出含有root的行
[root@localhost ~]# sed '/root/n;d' passwd
root:x:0:0:root:/root:/bin/bash
#在前面看到的都是單行模式。每次sed處理一個行。
#但是sed是允許一次處理多行的。加上N參數(shù)追加進模式空間,此時\
#sed將兩行看做一行,這就是所謂的多行模式空間。
#以下幾行是用于sed對多行模式空間進行操作練習的文件內(nèi)容
[root@localhost ~]# cat test
A friend is someone
with whom you
dare to be yourself.
#可以發(fā)現(xiàn)使用N參數(shù)沒有內(nèi)容被打印出來,是因為N參數(shù)讀取當前行的下一行至模式空間時\
#并不會覆蓋模式空間的上一行,此時模式空間‘當前行’與‘下一行’都存在,后面的d參數(shù)會\
#模式空間的內(nèi)容,所有沒有內(nèi)容被打印出來
[root@localhost ~]# sed '/root/N;d' passwd
[root@localhost ~]#
#使用N參數(shù)追加匹配到的行至模式空間,然后使用s參數(shù)進行替換,由于使用N參數(shù),原本\
#內(nèi)容的兩行此時在模式空間里被當作一行進行處理,把\n替換為空格后,由于中間沒有了\
#換行符,打印到屏幕上時會顯示為一行
[root@localhost ~]# sed '/A/{N;s/someone\n/someone /}' test
A friend is someone with whom you
dare to be yourself.
#對上條命令做了一點小小的修改。先說說這條命令要達成什么效果吧“把第二行的with挪到第一行”\
#這里的思路其實就是把換行符變動了位置,達到了把第二行的開頭挪到第一行的結(jié)尾的效果
[root@localhost ~]# sed '/A/{N;s/someone\nwith /someone with\n/}' test
A friend is someone with
whom you
dare to be yourself.
#咦?這里原本的第二行怎么不見了呢!來分析一下。首先把匹配的行讀入模式空間,后面的N參數(shù)\
#又把下一行追加至模式空間,此時模式空間有兩行內(nèi)容,但被看作一行,但這一行中間有\(zhòng)n,\
#P參數(shù)只打印模式空間開頭到\n之間的內(nèi)容,也就是說\n之后的內(nèi)容不會被打印出來
[root@localhost ~]# sed -n '/A/N;P' test
A friend is someone
dare to be yourself.
#D參數(shù)使用下面的文本作講解
[root@localhost ~]# cat sed_D
This is 1
This is 2
This is 3
This is 4
This is 5
#讀取1,執(zhí)行N,得出1\n2,執(zhí)行D,得出2
#執(zhí)行N,得出2\n3,執(zhí)行D,得出3
#依此類推,得出5,執(zhí)行N,條件失敗退出,因無-n參數(shù),故輸出5
[root@localhost ~]# sed 'N;D' sed_D
This is 5
#模式空間與保持的交互
#以下幾行用作下面練習的文件內(nèi)容
[root@localhost ~]# cat test
A friend is someone
with whom you
dare to be yourself.
#先匹配含有w的行,N參數(shù)把下一行也追加至模式空間,此時有模式有兩行內(nèi)容\
#h參數(shù)把模式空間的內(nèi)容復制到保持空間,之后d參數(shù)刪除模式空間的內(nèi)容\
[root@localhost ~]# sed '/w/{N;h;d}' test
A friend is someone
#
[root@localhost ~]# sed '/w/{N;h;d};/A/{N;s#is#the#g;G}' test
A friend the someone
with whom you
dare to be yourself.
到了這里,關(guān)于Sed命令詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!