整理:SED的模式空間與緩衝區及n,N,d,D,p,P,h,H,g,G,x解析
sed命令n,N,d,D,p,P,h,H,g,G,x解析
1、sed執行模板=sed ‘模式{命令1;命令2}’ 即逐行讀入模式空間,執行命令,最後輸出列印出來
2、p列印當前模式空間所有內容,追加到預設輸出之後;P列印當前模式空間開端至\n的內容,並追加到預設輸出之前。
Sed並不對每行末尾\n進行處理,但是對N命令追加的行間\n進行處理,因為此時sed將兩行看做一行。
3、n命令
n命令簡單來說就是提前讀取下一行,覆蓋模型空間前一行,然後執行後續命令。然後再讀取新行,對新讀取的內容重頭執行sed。
例子:從aaa檔案中取出偶數行
[root@localhost ~]# cat a.txt
This is 1
This is 2
This is 3
This is 4
This is 5
[root@localhost ~]# sed –n ‘n;p’ a.txt
This is 2
This is 4
[root@localhost ~]#
註釋:讀取This is 1,執行n命令,此時模式空間為This is 2,執行p,列印模式空間內容This is 2,之後讀取This is 3,執行n命令,此時模式空間為This is 4,執行p,列印模式空間內容This is 4,之後讀取This is 5,執行n命令,因為沒有了,所以退出,並放棄p命令。因此,最終列印出來的就是偶數行。
N命令簡單來說就是追加下一行到模式空間,同時將兩行看做一行,但是兩行之間依然含有\n換行符,然後執行後續命令。然後再讀取新行,對新讀取的內容重頭執行sed。此時,新讀取的行會覆蓋之前的行(之前的兩行已經合併為一行)。
例子:從aaa檔案中讀取奇數行
[root@localhost ~]# sed –n ‘N;P’ a.txt -----因為讀取第5行時,執行N,發現沒有第6行,不滿足,就退出,放棄P命令
This is 1
This is 3
[root@localhost ~]# sed –n ‘$!N;P’ a.txt
This is 1
This is 3
This is 5
[root@localhost ~]#
註釋中1代表This is 1 2代表This is 2 以此類推
註釋:讀取1,$!條件滿足(不是尾行),執行N命令,得出1\n2,執行P,列印得1,讀取3,$!條件滿足(不是尾行),執行N命令,得出3\n4,執行P,列印得3,讀取5,$!條件不滿足,跳過N,執行P,列印得5
4、d命令
d命令是刪除當前模式空間內容(不再傳至標準輸出),並放棄之後的命令,並對新讀取的內容,重頭執行sed。
[root@localhost ~]# sed ‘n;d’ a.txt
This is 1
This is 3
This is 5
[root@localhost ~]#
註釋:讀取1,執行n,得出2,執行d,刪除2,得空,以此類推,讀取3,執行n,得出4,執行d,刪除4,得空,但是讀取5時,因為n無法執行,所以d不執行。因無-n引數,故輸出1\n3\n5
D命令是刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之後的命令,但是對剩餘模式空間重新執行sed。
Sed ‘N;D’ aaa
This is 5
註釋:讀取1,執行N,得出1\n2,執行D,得出2,執行N,得出2\n3,執行D,得出3,依此類推,得出5,執行N,條件失敗退出,因無-n引數,故輸出5
5、y命令:對之前匹配的字元逐個替換
[root@localhost ~]# awk ‘{print $0”h”}’ a.txt | sed ‘y/his/HIS/’
THIS IS 1H
THIS IS 2H
THIS IS 3H
THIS IS 4H
THIS IS 5H
[root@localhost ~]#
此外,如果需要對某個字串進行大小寫轉換,則可使用如下方法
sed ‘s/\b[a-z]\b/\u&/g’ ddd
This is A and A is 1
This is B and B is 2
This is C and C is 3
This is D and D is 4
This is E and E is 5
6、h命令,H命令,g命令,G命令
h命令是將當前模式空間中內容覆蓋至快取區,H命令是將當前模式空間中的內容追加至快取區
g命令是將當前快取區中內容覆蓋至模式空間,G命令是將當前快取區中的內容追加至模式空間
[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘$G’ cs1.txt
PBCSPOFT0101 6
PBCSPOFT0102 0
PBCSPOFT0103 8
PB\CSPOFT0104 0
PBCSPOFT0101 6
[root@wmsvmpc ~]#
在sed處理檔案的時候,每一行都被儲存在一個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將列印在螢幕上。接著模式空間被清空,並存入新的一行等待處理。
在上面的例子裡,匹配test的行被找到後,將存入模式空間,h命令將其複製並存入一個稱為保持快取區的特殊緩衝區內。第二條語句的意思是,當到達最後一行後,G命令取出保持緩衝區的行,然後把它放回模式空間中,然後被列印(也就末尾)。
[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/G’ cs1.txt ---追加到包含102的行的下一行
PBCSPOFT0101 6
PBCSPOFT0102 0
PBCSPOFT0101 6
PBCSPOFT0103 8
PB\CSPOFT0104 0
將ddd檔案中數字和字母互換,並將字母大寫
cat ddd.sed
h
{
s/.*is \(.*\) and .*/\1/
y/abcde/ABCDE/
G
s/\(.*\)\n\(.*is \).*\(and \).*\(is \)\(.*\)/\2\5 \3\5 \4\1/
}
sed –f ddd.sed ddd
This is 1 and 1 is A
This is 2 and 2 is B
This is 3 and 3 is C
This is 4 and 4 is D
This is 5 and 5 is E
註釋:讀取1,執行h,複製到快取區,執行s,模式空間得到匹配到的字母a,然後執行y,將a轉成A,執行G,追加快取區內容到模式空間,得
A\nThis is a and a is 1;執行s,重新排列,得出This is 1 and 1 is A;以此類推,得出結果。
這裡需要注意的是匹配的內容中,空格一定要處理好,空格處理不對,會造成第二次s匹配錯誤,無法執行重新排列或排列錯誤
7、x命令
x命令是將當前快取區和模式空間內容互換
[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/x’ cs1.txt ---互換模式空間和保持緩衝區的內容。也就是把包含101與102的行互換。應該是替換,待百度
PBCSPOFT0101 6
PBCSPOFT0101 6
PBCSPOFT0103 8
PB\CSPOFT0104 0
[root@wmsvmpc ~]# echo –e “a\nb\nc\nd\n”|sed –nr ‘H;${x;s/\n//g;p}’
abcd
r:use extended regular expressions in the script,使用功能更強大的正規表示式。
${} 表示處理到檔案最後一行時執行{}中的命令,x把之前存入快取區的資料按先入先出的順序放入模式空間,然後做替換,最後列印
1、sed執行模板=sed ‘模式{命令1;命令2}’ 即逐行讀入模式空間,執行命令,最後輸出列印出來
2、p列印當前模式空間所有內容,追加到預設輸出之後;P列印當前模式空間開端至\n的內容,並追加到預設輸出之前。
Sed並不對每行末尾\n進行處理,但是對N命令追加的行間\n進行處理,因為此時sed將兩行看做一行。
3、n命令
n命令簡單來說就是提前讀取下一行,覆蓋模型空間前一行,然後執行後續命令。然後再讀取新行,對新讀取的內容重頭執行sed。
例子:從aaa檔案中取出偶數行
[root@localhost ~]# cat a.txt
This is 1
This is 2
This is 3
This is 4
This is 5
[root@localhost ~]# sed –n ‘n;p’ a.txt
This is 2
This is 4
[root@localhost ~]#
註釋:讀取This is 1,執行n命令,此時模式空間為This is 2,執行p,列印模式空間內容This is 2,之後讀取This is 3,執行n命令,此時模式空間為This is 4,執行p,列印模式空間內容This is 4,之後讀取This is 5,執行n命令,因為沒有了,所以退出,並放棄p命令。因此,最終列印出來的就是偶數行。
N命令簡單來說就是追加下一行到模式空間,同時將兩行看做一行,但是兩行之間依然含有\n換行符,然後執行後續命令。然後再讀取新行,對新讀取的內容重頭執行sed。此時,新讀取的行會覆蓋之前的行(之前的兩行已經合併為一行)。
例子:從aaa檔案中讀取奇數行
[root@localhost ~]# sed –n ‘N;P’ a.txt -----因為讀取第5行時,執行N,發現沒有第6行,不滿足,就退出,放棄P命令
This is 1
This is 3
[root@localhost ~]# sed –n ‘$!N;P’ a.txt
This is 1
This is 3
This is 5
[root@localhost ~]#
註釋中1代表This is 1 2代表This is 2 以此類推
註釋:讀取1,$!條件滿足(不是尾行),執行N命令,得出1\n2,執行P,列印得1,讀取3,$!條件滿足(不是尾行),執行N命令,得出3\n4,執行P,列印得3,讀取5,$!條件不滿足,跳過N,執行P,列印得5
4、d命令
d命令是刪除當前模式空間內容(不再傳至標準輸出),並放棄之後的命令,並對新讀取的內容,重頭執行sed。
[root@localhost ~]# sed ‘n;d’ a.txt
This is 1
This is 3
This is 5
[root@localhost ~]#
註釋:讀取1,執行n,得出2,執行d,刪除2,得空,以此類推,讀取3,執行n,得出4,執行d,刪除4,得空,但是讀取5時,因為n無法執行,所以d不執行。因無-n引數,故輸出1\n3\n5
D命令是刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之後的命令,但是對剩餘模式空間重新執行sed。
Sed ‘N;D’ aaa
This is 5
註釋:讀取1,執行N,得出1\n2,執行D,得出2,執行N,得出2\n3,執行D,得出3,依此類推,得出5,執行N,條件失敗退出,因無-n引數,故輸出5
5、y命令:對之前匹配的字元逐個替換
[root@localhost ~]# awk ‘{print $0”h”}’ a.txt | sed ‘y/his/HIS/’
THIS IS 1H
THIS IS 2H
THIS IS 3H
THIS IS 4H
THIS IS 5H
[root@localhost ~]#
此外,如果需要對某個字串進行大小寫轉換,則可使用如下方法
sed ‘s/\b[a-z]\b/\u&/g’ ddd
This is A and A is 1
This is B and B is 2
This is C and C is 3
This is D and D is 4
This is E and E is 5
6、h命令,H命令,g命令,G命令
h命令是將當前模式空間中內容覆蓋至快取區,H命令是將當前模式空間中的內容追加至快取區
g命令是將當前快取區中內容覆蓋至模式空間,G命令是將當前快取區中的內容追加至模式空間
[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘$G’ cs1.txt
PBCSPOFT0101 6
PBCSPOFT0102 0
PBCSPOFT0103 8
PB\CSPOFT0104 0
PBCSPOFT0101 6
[root@wmsvmpc ~]#
在sed處理檔案的時候,每一行都被儲存在一個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將列印在螢幕上。接著模式空間被清空,並存入新的一行等待處理。
在上面的例子裡,匹配test的行被找到後,將存入模式空間,h命令將其複製並存入一個稱為保持快取區的特殊緩衝區內。第二條語句的意思是,當到達最後一行後,G命令取出保持緩衝區的行,然後把它放回模式空間中,然後被列印(也就末尾)。
[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/G’ cs1.txt ---追加到包含102的行的下一行
PBCSPOFT0101 6
PBCSPOFT0102 0
PBCSPOFT0101 6
PBCSPOFT0103 8
PB\CSPOFT0104 0
將ddd檔案中數字和字母互換,並將字母大寫
cat ddd.sed
h
{
s/.*is \(.*\) and .*/\1/
y/abcde/ABCDE/
G
s/\(.*\)\n\(.*is \).*\(and \).*\(is \)\(.*\)/\2\5 \3\5 \4\1/
}
sed –f ddd.sed ddd
This is 1 and 1 is A
This is 2 and 2 is B
This is 3 and 3 is C
This is 4 and 4 is D
This is 5 and 5 is E
註釋:讀取1,執行h,複製到快取區,執行s,模式空間得到匹配到的字母a,然後執行y,將a轉成A,執行G,追加快取區內容到模式空間,得
A\nThis is a and a is 1;執行s,重新排列,得出This is 1 and 1 is A;以此類推,得出結果。
這裡需要注意的是匹配的內容中,空格一定要處理好,空格處理不對,會造成第二次s匹配錯誤,無法執行重新排列或排列錯誤
7、x命令
x命令是將當前快取區和模式空間內容互換
[root@wmsvmpc ~]# sed –e ‘/101/h’ –e ‘/102/x’ cs1.txt ---互換模式空間和保持緩衝區的內容。也就是把包含101與102的行互換。應該是替換,待百度
PBCSPOFT0101 6
PBCSPOFT0101 6
PBCSPOFT0103 8
PB\CSPOFT0104 0
[root@wmsvmpc ~]# echo –e “a\nb\nc\nd\n”|sed –nr ‘H;${x;s/\n//g;p}’
abcd
r:use extended regular expressions in the script,使用功能更強大的正規表示式。
${} 表示處理到檔案最後一行時執行{}中的命令,x把之前存入快取區的資料按先入先出的順序放入模式空間,然後做替換,最後列印
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25960404/viewspace-1818860/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【轉】sed命令n,N,d,D,p,P,h,H,g,G,x解析
- sed ‘1!G;h;$!d’解析
- H3D Engine3D
- C語言清空輸入緩衝區的N種方法對比C語言
- ICPC2023杭州站題解(B D E F G H J M)
- Codeforces 486D Valid Sets:Tree dp【n遍O(n)的dp】
- Java網路 1.7 h 和 p 標籤Java
- 命令列終端連線V-P-N命令列
- Linux 中 sed命令 h和H選項的應用Linux
- G. D-FunctionFunction
- echo -n "12345678" > /data/params/d/DongleId
- Win7 - Administrator登陸後變成Temp用戶Win7
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- PHP 解迷宮之 G + H 最小PHP
- D37 2-SAT P3007 [USACO11JAN] The Continental Cowngress G
- mysql的varchar(N)和int(N)的含義及其與char區別MySql
- 802.11a/b/g/n詳解
- 非1~2^n數列的自然數密碼《二D》密碼
- CCNA專業英文詞彙紅寶書---N、O、P、Q(轉)
- oracle10g的sysaux空間暴增與空間回收-轉載OracleUX
- Stanford機器人D-H座標系機器人
- C 標準庫IO緩衝區和核心緩衝區的區別
- 關於宏定義 Bin(n),LongToBin(n),LongToBin(0x##n##L)
- VARCHAR2(N CHAR)與VARCHAR2(N)的區別[Oracle基礎]Oracle
- decltype(p)和decltype(*p)的區別
- 緩衝區分析
- 從表mytest(a,b,c,d)中選取以c排序後的第N至N+3行排序
- 訊號與槽N對N
- gets()getchar()與緩衝區的問題
- 3D遊戲-作業三-空間與運動3D遊戲
- 360手機N7與小米6X區別對比 360 N7和小米6X哪個好?
- 360N5s與小米5X區別對比 小米5X和360N5s哪個好?
- 時間複雜度O(n)和空間複雜度時間複雜度
- http://39.101.167.253/d/NOIPhis/p/101HTTP
- P8304 [CoE R4 D] 01 串
- char(n)和varchar2(n)區別
- Maven中的-D(Properties屬性)和-P(Profiles配置檔案)Maven
- 區別oracle 9i 與 oracle 10g 備份表空間Oracle 10g