深入理解sed模式空間——sed 'n;p'

来源:https://www.cnblogs.com/wannacry/archive/2022/11/04/16850076.html
-Advertisement-
Play Games

在進入正題之前我們先來瞭解一下sed的模式空間,如下 什麼是sed的模式空間? 答(僅供參考):就是從文件讀取一行文本然後存入的緩衝區,然後命令操作模式空間的內容,在初始狀態下模式空間是沒有內容的,在每次迴圈讀取數據的過程中,模式空間都會被清空並寫入新的內容。 解釋以下命令結果: seq 10 | ...


在進入正題之前我們先來瞭解一下sed的模式空間,如下

什麼是sed的模式空間?

答(僅供參考):就是從文件讀取一行文本然後存入的緩衝區,然後命令操作模式空間的內容,在初始狀態下模式空間是沒有內容的,在每次迴圈讀取數據的過程中,模式空間都會被清空並寫入新的內容。

 

解釋以下命令結果:

  1. seq 10 | sed 'n;p'
  2. seq 10 | Sed -n 'n;p'
  3. seq 10 | sed 'p;n'
  4. seq 10 | sed -n p;n'

要進一步理解sed的工作原理,弄清上面四個命令便足夠了,大家不妨猜一下上面四條命令的輸出結果......

不知道大家有沒有猜對,不過結果如下:

我想應該不少人都會對上面的結果產生困惑,為了照顧到大部分人,我儘量啰嗦一點吧,如下

第一個命令seq 10 | sed 'n;p'

解:命令“ seq 10 ”按順序生成 1 到 10 的 10 行數據,通過管道命令“ | ”把結果傳給 sed 命令來處理,

  命令“ sed 'n;p' ”就會依次按行讀入管道|傳過來的數據,

  第一輪 sed :

  seq 把生成的“ 1 ”傳給 sed ,現在 sed 的處理緩衝區就有數據“ 1 ”,有了數據“ 1 ”之後 sed 便執行單引號里的“ n;p ”命令

  n和p用“ ; ”分隔,表示依次執行,所以先執行“ n ”命令,n命令的理解就很關鍵了(我一開始也搞不清楚),其實n命令就是讀入下一行數據,在“ seq 10 | sed 'n;p' ”這裡就是讀入“ 2 ”,那原來的“ 1 ”怎麼辦呢(關鍵),sed會預設把不要的數據丟到stdout(標準輸出,也就是屏幕)那裡,所以就會在屏幕上列印出第一行數據“ 1 ”;得到了第一個輸出然後命令還沒結束!

  剛剛執行的是“ n;p ”命令的 n ,接下來就到 p 了,p 就是直接列印 sed 緩衝區的內容,現在緩衝區裡面是“ 2 ”,所以直接列印“ 2 ”,現在我們的屏幕就有了2行數據了,分別是第一行:1,第二行:2

  第一輪 sed 'n;p' 執行完畢。

  第二輪 sed :

  與上面上第一輪的差不多,如下:

  seq 把生成的“ 3 ”傳給 sed (是 3 不是 2, 不要亂了),(關鍵)sed 的緩衝區裡面現在有“ 2 ”’,然後現在又讀入了新的“ 3 ”,sed會預設把不要的數據(在這裡就是 2 )丟到標準輸出,所以這時屏幕列印第三行數據“ 2 ”,所以現在 sed 的處理緩衝區就有數據“ 3 ”,有了數據“ 3 ”之後 sed 便執行單引號里的“ n;p ”命令

  n和p用“ ; ”分隔,表示依次執行,所以先執行“ n ”命令,n命令的理解就很關鍵了(我一開始也搞不清楚),其實n命令就是讀入下一行數據,在“ seq 10 | sed 'n;p' ”這裡就是讀入“ 4 ”,那原來的“ 3 ”怎麼辦呢(關鍵),sed會預設把不要的數據丟到stdout(標準輸出,也就是屏幕)那裡,所以就會在屏幕上列印出第四行數據“ 3 ”;得到了第四個輸出然後命令還沒結束!

  剛剛執行的是“ n;p ”命令的 n ,接下來就到 p 了,p 就是直接列印 sed 緩衝區的內容,現在緩衝區裡面是“ 4 ”,所以直接列印“ 4 ”,現在我們的屏幕就有了5行數據了,分別是第一行:1,第二行:2,第三行:2,第四行:3,第五行:4

  第二輪 sed 'n;p' 執行完畢。

  剩下來的都和上面一樣我就不啰嗦了(第一次寫這麼多,有點累了-_-||)

  以上就是對 seq 10 | sed 'n;p' 命令的詳細分析

再貼一次結果:

 

 

 

第二個命令seq 10 | sed -n 'n;p'

  第二個命令與第一個命令幾乎一樣,只是 sed 多了一個選項 -n ,(相信只要理解了第一個命令,現在這個就so easy了)

  首先理解 -n 的意思,就是只列印處理過的數據,在這裡再通俗點說就是sed緩衝區里不要的數據就不要丟到標準輸出了,你愛丟哪丟哪

  下麵過一遍流程:

  第一輪 sed :

  seq 把生成的“ 1 ”傳給 sed ,現在 sed 的處理緩衝區就有數據“ 1 ”,有了數據“ 1 ”之後 sed 便執行單引號里的“ n;p ”命令

  n和p用“ ; ”分隔,表示依次執行,所以先執行“ n ”命令,n命令的理解就很關鍵了(我一開始也搞不清楚),其實n命令就是讀入下一行數據,在“ seq 10 | sed -n 'n;p' ”這裡就是讀入“ 2 ”,那原來的“ 1 ”怎麼辦呢(關鍵),這時 sed 就不會把“ 1 ”丟到標準輸出了,所以屏幕上不會輸出“ 1 ”,

  剛剛執行的是“ n;p ”命令的 n ,接下來就到 p 了,p 就是直接列印 sed 緩衝區的內容,現在緩衝區裡面是“ 2 ”,所以直接列印“ 2 ”,現在我們的屏幕就有1行數據了,第一行:2

  第一輪 sed 'n;p' 執行完畢。

  第二輪 sed :

  與上面上第一輪的差不多,如下:

  seq 把生成的“ 3 ”傳給 sed ,(關鍵)sed 的緩衝區裡面現在有“ 2 ”’,然後現在又讀入了新的“ 3 ”,這時 sed 就不會把“ 2 ”丟到標準輸出了,所以屏幕上不會輸出“ 2 ”,所以現在 sed 的處理緩衝區就有數據“ 3 ”,有了數據“ 3 ”之後 sed 便執行單引號里的“ n;p ”命令

  n和p用“ ; ”分隔,表示依次執行,所以先執行“ n ”命令,n命令的理解就很關鍵了,其實n命令就是讀入下一行數據,在“ seq 10 | sed 'n;p' ”這裡就是讀入“ 4 ”,那原來的“ 3 ”怎麼辦呢(關鍵),sed 也不會把“ 2 ”丟到標準輸出了,所以屏幕上也不會輸出“ 2 ,”然後命令還沒結束!

  剛剛執行的是“ n;p ”命令的 n ,接下來就到 p 了,p 就是直接列印 sed 緩衝區的內容,現在緩衝區裡面是“ 4 ”,所以直接列印“ 4 ”,現在我們的屏幕就有了5行數據了,分別是第一行:2,第二行:4

  第二輪 sed 'n;p' 執行完畢。

再貼一次結果:

 

相信看到這裡的童鞋都應該有所收穫了,如果沒有那一定是我的問題,對不起!!!

剩下兩個命令我覺得就沒有必要再啰嗦了,相信大家可以自行推導,如果還有什麼不懂的可以私信我,看到就回!

第一次碼這麼多字,希望能對大家有所幫助,在此特地感謝李老師的講解,可以說全是他的深入講解的功勞!!!

 碼字不易,你們的是激勵我繼續分享的動力,如果有任何問題,歡迎評論區留言!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 嗨嘍,大家好呀~這裡是愛看美女的茜茜吶 又到了學Python時刻~ 開發環境 & 第三方模塊: 解釋器版本: python 3.8 代碼編輯器: pycharm 2021.2 requests: pip install requests pyecharts: pip install pyech ...
  • 前言 我們在啟動 Spring Boot 項目時,控制台會列印出 Spring Boot 專屬的標語,也稱 banner(橫幅標語/廣告),效果如下: 實際上,上面這個 banner,我們可以自定義,而很多公司也有使用自己的 banner 的。 下麵介紹在 Spring Boot 項目中使用自定義 ...
  • 昨天,有讀者私信發我一篇文章,說裡面提到的 Intellij IDEA 插件真心不錯,基本上可以一站式開發了,希望能分享給更多的小伙伴,我在本地裝了體驗了一下,覺得確實值得推薦,希望小伙伴們有時間也可以嘗試一下。 Vuesion Theme 顏值是生產力的第一要素,IDE 整好看了,每天對著它也是神 ...
  • 在上一篇文章`《驅動開發:內核封裝WSK網路通信介面》`中,`LyShark`已經帶大家看過瞭如何通過WSK介面實現套接字通信,但WSK實現的通信是內核與內核模塊之間的,而如果需要內核與應用層之間通信則使用TDK會更好一些因為它更接近應用層,本章將使用TDK實現,TDI全稱傳輸驅動介面,其主要負責連... ...
  • 本章`LyShark`將帶大家學習如何在內核中使用標準的`Socket`套接字通信介面,我們都知道`Windows`應用層下可直接調用`WinSocket`來實現網路通信,但在內核模式下應用層API介面無法使用,內核模式下有一套專有的`WSK`通信介面,我們對WSK進行封裝,讓其與應用層調用規範保持... ...
  • 【前言】 在日常開發工作中,我們經常要對變數進行操作,例如對一個int變數遞增++。在單線程環境下是沒有問題的,但是如果一個變數被多個線程操作,那就有可能出現結果和預期不一致的問題。 例如: static void Main(string[] args) { var j = 0; for (int ...
  • 需求:在Winform使用NOPI做導入時候,需要導入數據的同時導入圖片。 雖然代碼方面不適用(我好像也沒仔細看過代碼),但是感謝大佬給了靈感http://www.wjhsh.net/IT-Ramon-p-13100039.html,將excel尾碼修改成Zip,解壓,在其中找到圖片的xml位置信息 ...
  • 嵌入式系統安全的一些解決方法及缺陷 外部硬體安全模塊:在主SoC之外包含一個專用的硬體安全模塊或可信元件,e.g. 手機的SIM卡。==隔離僅限於可以從非易失性存儲器運行的相對靜態程式== 內部硬體安全模塊:管理加密操作和密鑰存儲的硬體模塊;通用的處理引擎,放在主處理器旁邊,它使用自定義硬體邏輯來防 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...