Posted on 2010-01-22 16:51
Prayer 閱讀(341)
評論(1) 編輯 收藏 引用 所屬分類:
Shell
正文:
pattern space 顧名思義,模式空間,你要處理文本,首先要找到文本,怎么尋找文本?用正則表達式尋找文本,比如 /abc/,表示匹配abc的行,找到的文本行,比如匹配"abc"的行(注意,是整行,而不僅僅只是字符串a(chǎn)bc),就會被放到pattern space中去,這就是pattern space的作用。
或許有人會問,對于pattern space,我不需要啊,我匹配到/abc/,我直接輸出就行了。
但是實際文本處理中,需求往往是這樣的,比如把匹配到/abc/的行,刪除這些行的末尾三個字符,在打印出來。
所以,pattern space 本質(zhì)就是,把匹配到的行暫存起來,然后進行一些處理,然后再輸出。正是因為需要進行一些處理,所以它是
有存在的必要。
hold space,顧名思義,保存空間,因為要進行復(fù)雜的文本處理,比如我想把匹配/dashi/的行,和匹配/meinv/的行,求這兩種行的交集,差集,并集等等,那么,僅僅有pattern space顯然是不夠用的,我要把匹配到/dashi/的行暫存起來,放到hold space中去,然后把匹配到美女的行,自動會放到 pattern space中去,這下,我可以對這兩個buffer中的內(nèi)容進行處理了。想求他們的交集就求交集,想求他們的并集就求他們的并集。隨心所欲。如果僅有一個buffer,顯然,后匹配的/meinv/內(nèi)容會放到pattern space 中去,前面匹配到的/dashi/內(nèi)容早就被清除了,只有美女,沒有大師的世界,是何等寂寞。所以, hold space 就是個臨時變量,用于需要處理多個匹配元素的場景。
其實這個問題涉及到sed的工作方式。sed編輯器逐行處理文件或輸入,它每處理完一行就將其從模式空間(pattern space)中刪除,然后將下一行讀入空間,進行處理和顯示。處理完輸入文件的最后一行,sed便結(jié)束運行。如果要同時處理兩行,那么只能把先讀進的那行找個地方暫存起來,這個地方就是hold space