通過幾個例子看sed的模式空間與保持空間

?

SED之所以能以行為單位的編輯或修改文本,其原因在于它使用了兩個空間:一個是活動的“模式空間(pattern space)”,另一個是起輔助作用的“暫存緩沖區(holdingspace)這2個空間的使用。

?

sed編輯器逐行處理文件,并將輸出結果打印到屏幕上。sed命令將當前處理的行讀入模式空間(pattern space)進行處理,sed在該行上執行完所有命令后就將處理好的行打印到屏幕上(除非之前的命令刪除了該行),sed處理完一行就將其從模式空間中刪除,然后將下一行讀入模式空間,進行處理、顯示。處理完文件的最后一行,sed便結束運行。sed在臨時緩沖區(模式空間)對文件進行處理,所以不會修改原文件,除非顯示指明-i選項。

?

sed之所以能以行為單位的編輯或修改文本,其原因在于它使用了兩個空間:一個是活動的“模式空間(pattern space)”,另一個是起輔助作用的“保持空間(hold space)這2個空間的使用。

?

模式空間:可以想成工程里面的流水線,數據之間在它上面進行處理,用于處理文本行。

?

保持空間:可以想象成倉庫,我們在進行數據處理的時候,作為數據的暫存區域,用于保留文本行,是保存已經處理過的輸入行,默認有一個空行。?

?

與模式空間和暫存空間(hold space)相關的命令:

?

n 輸出模式空間行,讀取下一行替換當前模式空間的行,執行下一條處理命令而非第一條命令。

?

N 讀入下一行,追加到模式空間行后面,此時模式空間有兩行。

?

h 把模式空間的內容復制到保留空間,覆蓋模式

?

H 把模式空間的內容追加到保留空間,追加模式

?

g 把保留空間的內容復制到模式空間,覆蓋模式

?

G 把保留空間的內容追加到模式空間,追加模式

?

x 將暫存空間的內容于模式空間里的當前行互換。

?

! 對所選行以外的所有行應用命令。

?

?

?

注意:暫存空間里默認存儲一個空行。

?

?

例子一?
sed G?
在文件每一行下面輸出一個空行?

代碼:

$ cat foo?
11111111111111?
22222222222222?
33333333333333?
44444444444444?
55555555555555?

$ sed G foo?
11111111111111?

22222222222222?

33333333333333?

44444444444444?

55555555555555?


解釋:?

sed 中 G 的用法?
The G function appends the contents of the holding area to the contents of the pattern space. The former and new contents are separated by a newline. The maximum number of addresses is two.?

hold space : 保持空間(或者叫保留空間、緩沖區),初始為空?
pattern space :模式空間?

在上面的例子中,將為空的hold space附加到文件的每一行后面,所以結果是每一行后面多了一個空行?

引申出:?
sed '/^$/d;G'?
在文件的每一個非空行下面輸出一個空行?
sed '/^$/d;G;G'?
在文件的每一個非空行下面輸出兩個空行?

代碼:

$ cat foo?
11111111111111?
22222222222222?

33333333333333?
44444444444444?
55555555555555?

$ sed '/^$/d;G' foo?
11111111111111?

22222222222222?

33333333333333?

44444444444444?

55555555555555?



注:有時會有一些由空格符或者TAB組成的空行,前面的正則式?^$?就不能匹配到這樣的行,則可以這樣?
sed '/[[:space:]]/d;G'?


例子二?
sed '/regex/{x;p;x;}'?
在匹配regex的所有行前面插入一個空行?
代碼:

$ cat foo?
11111111111111?
22222222222222?
test33333333333333?
44444444444444?
55555555555555?

$ sed '/test/{x;p;x;}' foo?
11111111111111?
22222222222222?

test33333333333333?
44444444444444?
55555555555555?


解釋:?
sed 中 x 的用法?
The exchange function interchanges the contents of the pattern space and the holding area. The maximum number of addresses is two.?
即交換保持空間hold space和模式空間pattern space的內容?

sed 中 p 的作用是把模式空間復制到標準輸出。?

分析一下該命令執行過程中保持空間和模式空間的內容?

命令 保持空間 模式空間?
x 執行前:null 執行后:test\n 執行前:test\n 執行后:null?
p 執行前:null 執行后:test\n 執行前:test\n 執行后:null 輸出一個空行?
x 執行前:test\n 執行后:null 執行前:null 執行后:test\n?

(注:把test所在的行簡寫為test了)?

引申:?
可以試驗一下 sed '/test/{x;p;}' foo 或者 sed '/test/{p;x;}' foo 等,看看結果,體會兩個空間的變化?

相應的:?
sed '/regex/G'?是在匹配regex的所有行下面輸出一個空行?
sed '/regex/{x;p;x;G;}'?是在匹配regex的所有行前面和下面都輸出一個空行?


例子三?
sed 'n;G;'?
在文件的偶數行下面插入一個空行?
代碼:

$ cat foo?
11111111111111?
22222222222222?
33333333333333?
44444444444444?
55555555555555?

$ sed 'n;G;' foo?
11111111111111?
22222222222222?

33333333333333?
44444444444444?

55555555555555?

解釋:?
sed 中 n 的用法:將模式空間拷貝于標準輸出。用輸入的下一行替換模式空間。?

執行 n 以后將第一行輸出到標準輸出以后,然后第二行進入模式空間,根據前面對 G 的解釋,會在第二行后面插入一個空行,然后輸出;再執行 n 將第三行輸出到標準輸出,然后第四行進入模式空間,并插入空行,依此類推?

相應的:?
sed 'n;n;G'?表示在文件的第 3,6,9,12,... 行后面插入一個空行?
sed 'n;n;n;G'?表示在文件的第 4,8,12,16,... 行后面插入一個空行?
sed 'n;d'?表示刪除文件的偶數行?


例子四?
sed '$!N;$!D'?
輸出文件最后2行,相當于 tail -2 foo?

代碼:

$ cat foo?
11111111111111?
22222222222222?
33333333333333?
44444444444444?
55555555555555?

$ sed '$!N;$!D' foo?
44444444444444?
55555555555555?



解釋:?

D 刪除模式空間內第一個 newline 字母 \n 前的資料。?
N 把輸入的下一行添加到模式空間中。?

sed '$!N;$!D' : 對文件倒數第二行以前的行來說,N 將當前行的下一行放到模式空間中以后,D 就將模式空間的內容刪除了;到倒數第二行的時候,將最后一行附加到倒數第二行下面,然后最后一行不執行 D ,所以文件的最后兩行都保存下來了。?


還有 N 的另外一種用法?
代碼:

$ sed = foo | sed N?
1?
11111111111111?
2?
22222222222222?
3?
33333333333333?
4?
44444444444444?
5?
55555555555555?

$ sed = foo | sed 'N;s/\n/? ?/'?
1? ? ? ?11111111111111?
2? ? ? ?22222222222222?
3? ? ? ?33333333333333?
4? ? ? ?44444444444444?
5? ? ? ?55555555555555?

解釋:?
N 的作用是加上行號,可以用于格式化輸出文件?


例子五?
sed '1!G;h;$!d'?
sed -n '1!G;h;$p'?
將文件的行反序顯示,相當于 tac 命令(有些平臺沒有這個命令)?

代碼:

$ cat foo?
11111111111111?
22222222222222?
33333333333333?

$ sed '1!G;h;$!d' foo?
33333333333333?
22222222222222?
11111111111111?

$ sed -n '1!G;h;$p' foo?
33333333333333?
22222222222222?
11111111111111?


解釋:?
sed 中 h 用法:h?
The h (hold) function copies the contents of the pattern space into a holding area, destroying any previous contents of the holding area.?
意思是將模式空間的內容保存到保持空間中去?

sed 中的 d 表示刪除模式空間。?

1!G表示除了第一行以外,其余行都執行G命令;$!d表示除了最后一行以外,其余行都執行d命令。?

看一下sed '1!G;h;$!d'命令執行過程中保持空間與模式空間的變化:?

命令 保持空間 模式空間?
第一行 h;d 執行前:null 執行后:1111\n 執行前:1111\n 執行后:null?
第二行 G;h;d 執行前:1111 執行后:2222\n1111\n 執行前:2222\n 執行后:null?
第二行 G;h 執行前:2222\1111\n 執行后:3333\n2222\n\1111\n 執行前:3333\n 執行后:3333\n2222\n\1111\n?

(注:把各個行簡寫了)?

這樣輸出以后就是文件的反序了。?

題外話:在vi中對一個文件進行反序顯示的命令是?:g/./m0?, 意思是按照文件正常順序每找到一行,就把該行放到文件的最上面一行去,這樣循環一下正好把文件的行反序顯示了。?

閱讀原文

轉載于:https://www.cnblogs.com/276815076/p/7879666.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281813.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dotnet 用 SourceGenerator 源代碼生成技術實現中文編程語言

相信有很多伙伴都很喜歡自己造編程語言,在有現代的很多工具鏈的幫助下,實現一門編程語言,似乎已不是一件十分困難的事情。我利用 SourceGenerator 源代碼生成技術實現了一個簡易的中文編程語言,核心原理是將中文編程語言翻譯為 C#…

斷電后supervisor啟動時報錯

當設備意外斷電后,supervisor在系統啟動時報錯,導致程序假死,此問題可以用systemd來替換supervisor。轉載于:https://www.cnblogs.com/gaoyiping/p/6950470.html

Vue單頁面在ios10系統上出現白屏的bug

一個bug 你用Vue做了一個單頁面應用,它在一切設備上都工作正常,但是突然有一天,你的測試和你說,這個網站在iOS 10上跑不起來,怎么辦?于是你打開你電腦上的Chrome瀏覽器,工作正常;打開…

HTTP/2 規格制定完成

IETF HTTP工作者的負責人Mark Nottingham在其博客上宣布HTTP/2規格制定完成,接下來將是分配RFC編號和正式發表。HTTP是Web的核心技術之一,相比HTTP/1,HTTP/2的改進之處包括更快的頁面加載;更長久的連接;服務器推送&…

【習題 6-7 UVA - 804】Petri Net Simulation

【鏈接】 我是鏈接,點我呀:) 【題意】 在這里輸入題意 【題解】 模擬就好 【代碼】 /* 1.Shoud it use long long ? 2.Have you ever test several sample(at least therr) yourself? 3.Can you promise that the solution is right? At least,the main ideal 4.use the p…

easyui combobox java_Easyui的combobox實現動態數據級聯效果

實現從數據庫中動態獲取對應的list集合,并在easyui的combobox中顯示出來。實現的效果如下:1、數據庫的表設計如圖所示2、數據庫中填寫相關的數據,如圖所示。如圖所示【法律法規】是所屬欄目,因此他的字段parentid是0。【中國公民出…

為什么應該默認將 Class 設為密封類?

前言最近在 dotnet/sdk 上看到一個 Issue,它提出了一個有趣的要求:默認情況下將類設置為密封類(Sealed)?什么是密封類?默認情況下,類是開放的,這意味著它是可以被繼承的。例如:class BaseClass …

Spring工具類的使用

2019獨角獸企業重金招聘Python工程師標準>>> Spring-core中提供了大量的工具類,常用的有StringUtils、ObjectUtils、NumberUtils、Base64Utils等,Spring工具類在spring-core.jar中的org.springframework.util包下。 org.springframework.util…

python作業高級FTP(第八周)

作業需求: 1. 用戶加密認證 2. 多用戶同時登陸 3. 每個用戶有自己的家目錄且只能訪問自己的家目錄 4. 對用戶進行磁盤配額、不同用戶配額可不同 5. 用戶可以登陸server后,可切換目錄 6. 查看當前目錄下文件 7. 上傳下載文件,保證文件一致性 8…

java用log.i打印數組_java-使用JSCH將ssh日志打印到列表(android)

我一直試圖通過將包含我目錄名稱的log.i字符串值添加到數組中,然后使用數組適配器通過listView打印它們,來在listView中的目錄中打印項目.但是,當我嘗試運行該應用程序時,它將打印包含目錄名稱的日志,但不會在listView上打印任何內容.有什么幫助嗎?這是我的代碼&…

Edge 瀏覽器被爆存在 XSS 繞過漏洞

來自知名安全測試套件Burp Suite廠商PortSwigger的安全專家Gareth Heyes近日在微軟Edge瀏覽器的內置XSS過濾器存在繞過漏洞,這就意味著盡管微軟在Edge瀏覽器中進行了大量的安全策略部署,但用戶瀏覽網頁的時候依然有可能讓攻擊者通過這種方式在Edge瀏覽器…

來了!十大更新

面向 Windows 10 正式版用戶,微軟發布了 2022 年 10 月更新。Windows 10 版本 21H1 更新后操作系統內部版本升級至 Build 190432130/2132(帶外更新)。Windows 10 版本 21H2 更新后操作系統內部版本升級至 Build 19044.2130/2132(帶…

使用ansible 批量分發SSH Key

先確保你電腦有ansible,我是mac的用brew安裝,其他可用yum安裝brew search ansiblebrew install ansible我已經安裝好2.7了生成下自己的key,一路回車ssh-keygen -t rsa編輯host,添加需要增加ssh key的機器vi /etc/ansible/hosts【hostgroup】我…

使用Git簡單筆記

這里只是作為簡單的筆記整理,第一次使用的推薦先看一下廖大的教程,內容很多很細,可以邊看邊練、看不懂的地方先記著、爭取七七八八看下來。 心情不佳的分割線 廖雪峰的git教程: https://www.liaoxuefeng.com/wiki/001373951630592…

java中的path類_詳談java中File類getPath()、getAbsolutePath()、getCanonical的區別

簡單看一下描述,例子最重要。1、getPath():返回定義時的路徑,(就是你寫什么路徑,他就返回什么路徑)2、getAbsolutePath():返回絕對路徑,但不會處理“.”和“..”的情況3、getCanonicalPath():返…

部署站點支持Https訪問的方法

1、申請公鑰和私鑰,放到服務器 2、編輯default配置文件 改為 加上證書路徑 ps:泛域名支持admin.xxx.com、demo.xxx.com等等,而免費的Lets Encrypt僅支持www.xxx.com和xxx.com 整理自www.laravist.com轉載于:https://www.cnblogs.com/lamp01/p/6952464.ht…

.NET Core Onvif協議C#教程系列之XiaoFeng.Onvif組件庫

物聯網IOT大背景下音視頻領域的Onvif 協議在2008年成為全球性的開放接口標準。于是一批開發者涌入該技術領域使用各種編程語言對其改造升級封裝。因為是國際標準,所以規范內容比較多,物聯網領域涉及又廣,所以研究協議是一個很耗時間的一項工作…

php異常處理的深入

引出 如果你調一個類,調用時數據驗證時報了個錯,你會以什么方式返回 數組,布爾值? 數組這個可以帶錯誤原因回來,那布爾值呢? 返回了個 false, 報錯時把錯誤放在類變量里?還是專門用一個獲取錯誤…

C# 跨平臺的支付類庫ICanPay

隨著微軟的開源,越來越多的項目支持跨平臺,但是各種支付平臺提供的類庫,又老又不支持跨平臺,吐槽下,尤其是微信,還有好多坑,于是ICanPay誕生了,今天就來講ICanPay是什么,…

.NET CORE 下收發郵件之 MAILKIT

背景利用代碼發送郵件在工作中還是比較常見的,相信大家都用過SmtpClient來處理發送郵件的操作,不過這個類以及被標記已過時,所以介紹一個微軟推薦的庫MailKit來處理。MailKit開源地址:https://github.com/jstedfast/MailKit需要郵…