青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

sed學習筆記二--高級命令

Posted on 2010-09-15 10:33 Prayer 閱讀(1597) 評論(0)  編輯 收藏 引用 所屬分類: Shell
版權聲明:原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://licong.blog.51cto.com/542131/204226
之前寫過一篇《sed學習筆記》http://licong.blog.51cto.com/542131/152541,講了一點sed入門的東西,本篇將繼續介紹sed高級命令部分。所謂高級,主要是指這里將要提到的命令都能改變sed執行或者控制的流程順序(sed通常都是一行被讀入模式空間,并用腳本中的sed命令一個接一個的應用于那一行) 

高級sed命令分成3個組:

1、    處理多行模式空間(NDP)。

2、    采用保持空間來保存模式空間的內容并使他們可用于后續的命令(HhGgx)。

3、    編寫使用分支和條件指令的腳本來更改控制流(:、bt)。 

N命令:追加下一行
多行Next(N)命令通過讀取當前行的下一行,并把兩行拼成一行來進行接下來的處理。
$ cat file
line 1
line 2
line 3
line 4
file文件中的每一行后面都有一個隱藏的換行符”\n”sed不對每行末尾的”\n”進行處理。
$ sed N file
line 1
line 2
line 3
line 4
經過N處理過的輸出和原文件沒有區別,但是本質是不一樣的。這里sed其實認為自己打印的是2行,第一行為”line 1\nline 2”,而第2行為”line 3\nline 4”,注意這里的2行末尾依然隱藏換行符”\n”sed依然不處理行尾的”\n”,但是處理行內的”\n”。因為這里默認的動作是打印,所以處理行內的”\n”我們也看不出來。
值得注意的是,處理line 1時,line 2被讀入并追加到line 1后面,所以line 1處理完后不再讀入line 2(前面已經讀過了)而直接讀入line 3進行下一個N命令(即讀入line 4并追加到line 3后面)。
上面2段如果不理解的話,看下面這個命令:
$ sed ‘N;s/\n/ /g’ file
line 1 line 2
line 3 lin3 4
這個命令在原來的基礎上把行內的”\n”替換成空格了(盡管用了全局替換標志gsed依然不處理行尾換行符!),看明白N的作用了嗎,單獨的N可以創建2行模式空間。 
D命令:刪除多行模式空間中,直到第一個行內的”\n”為止的所有內容。
D命令通常位于N命令之后,用于處理N命令創建的多行模式空間。D命令刪除多行模式空間行內第一個”\n”及其之前的內容后,對余下的內容(第一個行內”\n”之后的內容)重新從sed第一個命令進行處理。

Dd的相同點是,刪除內容后,重新從sed第一個命令開始處理,這一點看來Dd都有改變sed執行順序的能力;區別在于d刪除模式空間中的所有內容,然后重新讀取文本下一行從sed頂部進行處理,而D刪除模式空間的一部分內容,而將模式空間剩下的內容從sed頂部進行處理。
$ sed ‘N;d’ file
$
$sed ‘N;D’ file
line 4
‘N;d’每次創建2行模式空間,并將模式空間的內容全部刪除,所以結果所有4行(sed看來是2行)都刪除了。如果file5行數據,則第5行將被打印出來,因為第5行執行N時讀不到下一行了,所以d不執行,打印第5行,你可以自己試一試。
‘N;D’每次創建2行模式空間,刪除前面一行,并將模式空間的第2行繼續執行’N;D’,直到最后一行N沒內容可讀,不執行D,而是打印最后一行。’N;D’實際構成了一個循環(想想N直接讀入下一行,對2行進行處理,下一次對第2行就不處理了而是讀取第3行處理;而加了D之后,先處理2行,再對剩下的第2行接著進行處理) 
P命令:打印模式空間直到第一個”\n”為止的所有內容。
p(小寫)是打印模式空間的所有內容,P(大寫)是打印模式空間的一部分,這一區別和D/d類似。有一點要注意,不要把任何命令放在d或者D后面,因為那樣該命令永遠也沒有執行的機會了。例如sed ‘N;D;P’ filesed ‘N;D’ file是完全相同的效果。
$ cat file
line 1 li
cong line 2
line 3 licong
line 4 li
cong line 5
我們要把分在兩行的licong合到一行應該怎么做呢?
$ sed 'N;s/li\ncong */licong\n/g;P;D' file
line 1 licong
line 2
line 3 licong
line 4 licong
line 5
執行這個sed命令的流程是這樣的:
一、首行文本應用N讀取下一行,構成2行模式空間
line 1 li\n
cong line 2
s命令將li\ncong (注意cong后有一個空格)替換成licong\n,
line 1 licong
line 2
接著執行P,打印line 1 licongP結束后兩行模式空間沒有改變)
再對兩行模式空間執行D,刪除line 1 licong\n,并將剩下的line 2做為新的模式空間從頭執行sed命令;
二、對模式空間內容line 2先執行N,讀取下一行line 3 licong,創建兩行模式空間
line 2
line 3 licong
這次s沒找到匹配內容,所以執行s后面的P;D命令,重新打印、刪除,進行下一輪循環;
。。。
三、最后一行line 5執行N沒有內容可讀,直接打印該行。
 
hHgGx這幾個命令都是用于模式空間和保持空間轉換的。這里有必要解釋一下模式空間和保持空間了:
模式空間——容納當前輸入行的緩沖區。
除了h/H/g/G/x,其他所有sed命令都是針對模式空間的內容進行處理的!
保持空間——模式空間以外的一個預留緩沖區。
只有h/H/g/G/x命令可以訪問到保持空間的內容,并用于與模式空間內容的轉換。

h:將模式空間的內容復制到保持空間,類似與重定向符號>,會覆蓋原由保持空間內容
H:將模式空間的內容追加到保持空間,類似與追加重定向>>,追加到保持空間的尾行下
g:類似h,將保持空間的內容復制到模式空間
G:類似H,將保持空間的內容追加到模式空間
x:交換模式空間與保持空間中的內容 

$ cat file
1
2
11
22
$ sed ‘/1/{h;d};/2/G’ file
2
1
22
11
這個sed命令完成了反轉的功能,我們來看看是怎么實現的:
一、/1/{h;d}命令搜索模式空間包含1的行然后先后執行hd命令。結果首行1將被應用,h把該行(內容為1)復制到保持空間,此時模式空間和保持空間中的內容為:
模式空間:1
保持空間:1
接著執行dd不能訪問保持空間,只處理模式空間的內容,將模式空間的內容刪除,此時:
模式空間:      (空,沒有內容)
保持空間:1
二、d命令執行完之后,執行/2/G,即在模式空間搜索包含2的行進行G處理,而此時模式空間無內容,所以不做任何操作。
三、讀取下一行文本到模式空間,繼續執行’/1/{h;d};/2/G’。下一行文本的內容是2,此時:
模式空間:2
保持空間:1
與步驟二的道理相同,hd得不到執行(因為模式可空間沒找到包含1的行);而’/2/G’將被執行,將保持空間的內容追加到模式空間后面,此時:
模式空間:2
         1
保持空間:1
這一步完成以后,模式空間的內容將被sed默認地打印出來(如果有-n參數才不打印),于是前兩行處理完之后,將輸出:
2
1

同理,后兩行處理完之后,將輸出:
22
11
于是,我們看到了最后的結果:
2
1
22
11 
這個最簡單的例子有很多地方值得挖掘,我們就來看看最重要的幾點。

1、 sed后面帶有一個以上的命令時,它的處理順序是這樣的:

一次讀入一行到模式空間,然后將所有的命令應用于該行;而不是一次將一個命令作用與所有行;

2、 當某個條件后面有{}時,{}里面的命令依次作用于滿足該條件的行;

3、 h/H/g/G命令操作緩沖區時,都會在目的緩沖區后加一個換行(即使該緩沖區無內容),然后復制或追加源緩沖區內容在該換行符之后;

4、 沒有使用-n參數時,當一行執行完所有命令后,sed會默認打印最終模式空間中的內容;

如果使用-n參數,只有應用了p/P命令的模式空間內容才會被打印出來。


x命令暫不舉例,我們來看看最后一組高級命令(:、bt
分支(b)和測試(t)命令幾乎可以任意改變sed命令的執行順序,他們都將sed轉移到包含標簽的行,如果沒有指定標簽,則將轉移到命令末尾。b用于無條件的轉移(即一碰到b立刻轉移);t用于有條件轉移,只有當替換命令改變當前行時才會執行。 
標簽定義:
:lable
lable可以隨便用什么名字,自己能方便看明白就行;冒號和標簽之間不允許有空格,lable后面如果有空格將被認為是lable的一部分(不建議在lable后面帶空格)
bt的用法:
[address]b [lable]
[address]t [lable]
b/tlable之間有空格,但lable后面不要插入空格。
舉例:
$ cat file
line 1 li
cong line 2
line 3 licong
line 4 li
cong line 5 

$ sed -n '$!{/licong/!{h;N;D}
x;G;N;p;b
}
${/licong/{x;G;p}}' file
cong line 2
line 3 licong
line 4 li 
這個sed命令的功能是尋找包含字符串licong的行,并打印該行及其前后一行。這個命令并不完善,它不能很好的處理第一行匹配的情況,加入該功能命令會變得更復雜。我們來解釋一下上面的結果是怎么來的。
一、sed -n '$!{/licong/!{h;N;D}
x;G;N;p;b
對除末行以外的所有行($!的作用),執行/licong/!{h;N;D}x;G;N;p;b
二、/licong/!{h;N;D}
對不包含字符串licong的行依次執行hND,第一行line 1 li不包含licong,于是執行:
把該行復制到保持空間,讀取追加下一行,此時
模式空間:line 1 li
cong line 2
保持空間:line 1 li
再對模式空間執行D,并接著從頭處理新的模式空間,此時
模式空間:cong line 2
保持空間:line 1 li
三、從頭對模式空間的內容cong line 2執行$!{/licong/!{h;N;D},此時的模式空間依然不包含licong,所以進行一二兩步同樣的操作,結束后:
模式空間:line 3 licong
保持空間:cong line 2
四、再從頭對新的模式空間line 3 licong執行/licong/!{h;N;D}x;G;N;p;b。因為此時的模式空間包含licong,所以不執行h;N;D了,而是執行x;G;N;p;bx用與交換模式空間和保持空間的內容,交換的結果是:

模式空間:cong line 2
保持空間:line 3 licong

接下來執行G,將保持空間的內容追加到模式空間之后:

 模式空間:cong line 2
           line 3 licong
保持空間:line 3 licong

再執行N,將下一行讀取追加到模式空間之后:

 模式空間:cong line 2
line 3 licong
                    line 4 li
保持空間:line 3 licong
再執行p,打印模式空間的內容:
cong line 2
    line 3 licong
       line 4 li            (這就是我們看到的結果)
之后還有一個b,就是跳過b后面的命令,再讀下一行。命令最后一部分${/licong/{x;G;p}}是用來處理最后一行的,如果最后一行包含licong則打印該行很上面一行(而不打印下一行,因為沒有N命令)

到此,sed的高級命令就介紹完了。《sed&awk》第二版有一句話:“一旦你理解了這里所給出的命令,那么就可以認為自己是真正的sed的主人了。”
再總結一下sed所有的功能,總的來說還是替換命令’[address]s/source/replace/flag’最常用,而高級命令則用于完成復雜的任務;還有sed-n(抑制默認輸出)、-i(更改原文件)等參數也很常用。 
就寫到這里吧,等待拍磚了。。。

本文出自 “licong” 博客,請務必保留此出處http://licong.blog.51cto.com/542131/204226

本文出自 51CTO.COM技術博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲性感美女99在线| 欧美在线综合| 国产精品视频网| 国产精品久久激情| 国产精品一区久久| 国产欧美亚洲精品| 国产一区二区三区在线观看视频| 国产欧美精品一区aⅴ影院| 国产伪娘ts一区| 亚洲清纯自拍| 亚洲在线观看视频| 久久躁狠狠躁夜夜爽| 亚洲第一网站免费视频| 亚洲精品一区久久久久久 | 亚洲茄子视频| 亚洲一区视频在线观看视频| 小嫩嫩精品导航| 欧美国产欧美亚洲国产日韩mv天天看完整 | 99国产精品久久久久老师| 免费不卡在线观看| 亚洲精品你懂的| 一区二区三区导航| 久久亚洲视频| 国产欧美精品一区二区色综合| 亚洲人午夜精品免费| 久久精品国产综合精品| 亚洲人成在线观看| 久久久精品免费视频| 国产精品初高中精品久久| 亚洲大胆在线| 久久精品91久久香蕉加勒比| 91久久午夜| 久久综合五月| 国产一区二区三区成人欧美日韩在线观看 | 久久精品动漫| 欧美精品啪啪| 亚洲国产精品va在线观看黑人| 日韩视频精品在线| 久色婷婷小香蕉久久| 亚洲欧美日产图| 欧美婷婷久久| 欧美在线高清| 亚洲日本激情| 久久精品91| 国产精品久在线观看| 亚洲国产黄色片| 久久野战av| 午夜一区二区三区在线观看| 欧美天天综合网| 亚洲视频在线二区| 亚洲精品无人区| 欧美日韩国产二区| 一区二区三区四区五区在线 | 一区二区三区色| 欧美日韩一区二区三区视频| 亚洲靠逼com| 亚洲国产专区| 欧美国产1区2区| 亚洲精品久久久久久一区二区 | 国产女主播一区二区| 亚洲欧美影音先锋| 宅男精品导航| 国产精品日韩高清| 欧美制服丝袜第一页| 小嫩嫩精品导航| 伊人久久亚洲美女图片| 免费观看成人网| 欧美成人黑人xx视频免费观看| 亚洲电影第三页| 亚洲激情视频在线播放| 欧美日韩免费观看一区二区三区 | 亚洲一区3d动漫同人无遮挡| 欧美日韩亚洲系列| 亚洲欧美在线aaa| 欧美一区二区黄| 亚洲国产精品黑人久久久| 欧美激情精品久久久久久黑人 | 国产精品最新自拍| 久久久国产精彩视频美女艺术照福利| 香蕉av777xxx色综合一区| 狠狠做深爱婷婷久久综合一区| 美日韩精品免费| 欧美日韩国产一区二区三区| 新片速递亚洲合集欧美合集| 久久免费视频网站| 一本色道久久88综合日韩精品| 这里只有精品视频在线| 国产亚洲视频在线观看| 亚洲国产成人av好男人在线观看| 欧美日韩国产亚洲一区| 久久久久免费视频| 久久夜色精品一区| 欧美国产专区| 欧美 日韩 国产在线| 久久久精品一区二区三区| 在线观看一区二区精品视频| 亚洲日本成人| 国产欧美一区二区三区久久人妖| 久久在线视频在线| 欧美日韩在线精品| 久久午夜影视| 欧美视频一区二区在线观看 | 欧美激情五月| 国产精品免费网站| 亚洲国产精品久久| 国产区亚洲区欧美区| 亚洲国产高清自拍| 国产一区二区三区在线免费观看 | 99av国产精品欲麻豆| 性欧美18~19sex高清播放| 亚洲日本视频| 久久gogo国模啪啪人体图| 中文欧美在线视频| 欧美黄网免费在线观看| 久久日韩精品| 国产精品视频久久| 夜夜嗨av一区二区三区网站四季av | 久久久噜噜噜久久人人看| 欧美a级一区二区| 麻豆91精品| 国内成+人亚洲| 午夜精品一区二区三区电影天堂 | 亚洲免费一级电影| 欧美激情偷拍| 欧美激情综合| 亚洲激情电影中文字幕| 久久久久久夜精品精品免费| 久久激情一区| 国产日韩在线不卡| 性久久久久久久久| 久久青青草原一区二区| 韩国av一区二区三区| 欧美在线一二三| 蜜桃av噜噜一区| 亚洲国产岛国毛片在线| 久久综合色一综合色88| 欧美jizzhd精品欧美巨大免费| 黄色国产精品| 麻豆精品传媒视频| 亚洲欧洲精品一区二区三区| 亚洲日本无吗高清不卡| 欧美日韩国产不卡在线看| 99亚洲视频| 久久激情五月丁香伊人| 在线观看欧美日韩| 欧美精品在线播放| 一区二区三区产品免费精品久久75 | 91久久视频| 亚洲永久免费观看| 在线不卡亚洲| 久久午夜激情| 欧美激情一区二区三区全黄| 亚洲欧洲精品一区二区三区不卡 | 欧美成人69av| 亚洲激情电影在线| 欧美日本在线视频| 一区二区三欧美| 久久久久国产一区二区三区四区| 国产亚洲欧美另类中文| 久久夜色精品国产噜噜av| 亚洲老板91色精品久久| 欧美一区二区私人影院日本| 在线看不卡av| 欧美日韩在线播放一区| 欧美专区第一页| 91久久精品国产91性色tv| 亚洲综合电影| 亚洲二区免费| 国产精品乱码妇女bbbb| 久久久国产一区二区| 日韩一二在线观看| 久久亚洲国产精品日日av夜夜| 亚洲精品自在久久| 国产一区二区三区久久| 欧美女主播在线| 久久精品男女| 亚洲午夜精品久久久久久浪潮| 毛片基地黄久久久久久天堂| 在线视频日本亚洲性| 狠狠色狠色综合曰曰| 欧美午夜精品久久久久久超碰| 欧美中文在线视频| 一区二区三区精品久久久| 嫩草伊人久久精品少妇av杨幂| 亚洲天堂av综合网| 尤物yw午夜国产精品视频| 国产精品黄视频| 欧美国产乱视频| 久久久国产亚洲精品| 亚洲欧美美女| 一区二区欧美日韩视频| 亚洲国产精品一区二区第一页| 久久久精品一区二区三区| 亚洲综合好骚| 一本色道久久综合狠狠躁篇的优点 | 国产精品xxx在线观看www| 欧美日韩一区在线观看视频| 亚洲国产专区校园欧美| 狂野欧美激情性xxxx| 香蕉久久夜色|