【转】 SED多行模式空间
1、
sed執(zhí)行模板=sed?'模式{命令1;命令2}'
即逐行讀入模式空間,執(zhí)行命令,最后輸出打印出來
2、
為方便下面,先說下p和P,p打印當前模式空間內容,追加到默認輸出之后,P打印當前模式空間開端至\n的內容,并追加到默認輸出之前。
sed并不對每行末尾\n進行處理,但是對N命令追加的行間\n進行處理,因為此時sed將兩行看做一行。
2-1、n命令
n命令簡單來說就是提前讀取下一行,覆蓋模型空間前一行(并沒有刪除,因此依然打印至標準輸出),如果命令未執(zhí)行成功(并非跳過:前端條件不匹配),則放棄之后的任何命令,并對新讀取的內容,重頭執(zhí)行sed。
例子:
從aaa文件中取出偶數(shù)行
| 1 2 3 4 5 6 7 8 9 10 | cat?aaa? This?is?1???? This?is?2???? This?is?3???? This?is?4???? This?is?5???? ????? sed?-n?'n;p'?aaa?????????//-n表示隱藏默認輸出內容???? This?is?2???? This?is?4 |
注 釋:讀取This?is?1,執(zhí)行n命令,此時模式空間為This?is?2,執(zhí)行p,打印模式空間內容This?is?2,之后讀取 This?is?3,執(zhí)行n命令,此時模式空間為This?is?4,執(zhí)行p,打印模式空間內容This?is?4,之后讀取This?is?5,執(zhí)行n 命令,因為沒有了,所以退出,并放棄p命令。
因此,最終打印出來的就是偶數(shù)行。
?
2-2、N命令
N命令簡單來說就是追加下一行到模式空間,同時將兩行看做一行,但是兩行之間依然含有\(zhòng)n換行符,如果命令未執(zhí)行成功(并非跳過:前端條件不匹配),則放棄之后任何命令,并對新讀取的內容,重頭執(zhí)行sed。
例子:
從aaa文件中讀取奇數(shù)行
| 1 2 3 4 5 6 7 8 9 10 11 | cat?aaa??? This?is?1??? This?is?2??? This?is?3??? This?is?4??? This?is?5??? ????????????????????????????????????????????????????? sed?-n?'$!N;P'?aaa???????????? This?is?1??? This?is?3??? This?is?5 |
注釋中1代表This?is?1???2代表This?is?2??以此類推
注釋:讀取1,$!條件滿足(不是尾行),執(zhí)行N命令,得出1\n2,執(zhí)行P,打印得1,讀取3,$!條件滿足(不是尾行),執(zhí)行N命令,得出3\n4,執(zhí)行P,打印得3,讀取5,$!條件不滿足,跳過N,執(zhí)行P,打印得5
?
2-3、d命令
d命令是刪除當前模式空間內容(不在傳至標準輸出),并放棄之后的命令,并對新讀取的內容,重頭執(zhí)行sed。
d命令例子
從aaa文件中取出奇數(shù)行
| 1 2 3 4 5 6 7 8 9 10 11 | cat?aaa??? This?is?1??? This?is?2??? This?is?3??? This?is?4??? This?is?5??? ??????????????????????????????????????????????????????????? sed?'n;d'?aaa??????????? This?is?1??? This?is?3??? This?is?5 |
注釋:讀取1,執(zhí)行n,得出2,執(zhí)行d,刪除2,得空,以此類推,讀取3,執(zhí)行n,得出4,執(zhí)行d,刪除4,得空,但是讀取5時,因為n無法執(zhí)行,所以d不執(zhí)行。因無-n參數(shù),故輸出1\n3\n5
2-4、D命令
D命令是刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執(zhí)行sed。
D命令例子
從aaa文件中讀取最后一行
| 1 2 3 4 5 6 7 8 9 | cat?aaa??? This?is?1??? This?is?2??? This?is?3??? This?is?4??? This?is?5??? ???????????????????????????????????????????????? sed?'N;D'?aaa??????????? This?is?5 |
注釋:讀取1,執(zhí)行N,得出1\n2,執(zhí)行D,得出2,執(zhí)行N,得出2\n3,執(zhí)行D,得出3,依此類推,得出5,執(zhí)行N,條件失敗退出,因無-n參數(shù),故輸出5
?
2-5、y命令
y命令的作用在于字符轉換
y命令例子:
將aaa文件內容大寫
| 1 2 3 4 5 6 | sed?'y/his/HIS/'?aaa?? THIS?IS?1?? THIS?IS?2?? THIS?IS?3?? THIS?IS?4?? THIS?IS?5 |
此外,如果需要對某個字符串進行大小寫轉換,則可使用如下方法
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | cat?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??? ???? 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 |
2-6、h命令,H命令,g命令,G命令
h命令是將當前模式空間中內容覆蓋至保持空間,H命令是將當前模式空間中的內容追加至保持空間
g命令是將當前保持空間中內容覆蓋至模式空間,G命令是將當前保持空間中的內容追加至模式空間
命令例子:
將ddd文件中數(shù)字和字母互換,并將字母大寫
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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,執(zhí)行h,復制到保持空間,執(zhí)行s,模式空間得到匹配到的字母a,然后執(zhí)行y,將a轉成A,執(zhí)行G,追加保持空間內容到模式空間,得
A\nThis?is?a?and?a?is?1;執(zhí)行s,重新排列,得出This?is?1?and?1?is?A;以此類推,得出結果。
這里需要注意的是匹配的內容中,空格一定要處理好,空格處理不對,會造成第二次s匹配錯誤,無法執(zhí)行重新排列或排列錯誤
2-7、x命令
x命令是將當前保持空間和模式空間內容互換
?
轉自:http://hi.baidu.com/aaa103439/item/dbaa6d0d27b4f812cc34eab8
轉載于:https://www.cnblogs.com/nhlinkin/p/3566619.html
總結
以上是生活随笔為你收集整理的【转】 SED多行模式空间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA(小技巧--List)
- 下一篇: UpdatePanel Repeater