歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> sed D循環之反向輸出

sed D循環之反向輸出

日期:2017/2/28 15:47:34   编辑:Linux教程

說明:藍色=命令名稱

淺綠=命令參數

淺藍=選項

紫色=目錄

系統環境:CentOS 6.2 x86_64

需求:將 I love linux ! 反向輸出 :! linux love I

方法:echo 'I love linux !' |sed '/\n/!G;s/\([^ ]* \)\(.*\n\)/&\2\1/;//D;s/\n/ /'

650) this.width=650;" border=0>

解析:此方法關鍵在 D 參數。D 刪除模式空間中的第一行(確切的說應該時第一部分),如果刪除後,模式空間中還有剩余行,則返回 D 之前的命令,重新執行,如果 D 後,patten space 中沒有任何內容,則將退出 sed命令,將控制權交給 sed,在沒有 -n 參數時,sed 會輸出 pattern space 中的內容,如果最後一行沒有被讀入,則 sed 繼續讀入下一行,並去掉結尾的 \n 放到 pattern space 中,繼續執行 sed 命令如果最一行已經讀入,則退出 sed。

D 命令會引起循環,如果 D 被執行,那麼 D 後面的命令是不會被執行的。

第一次"/\n/!G;"沒有\n換行符,要執行G,因為保留空間中為空,所以在模式空間追加一空行,此時內容為
模式空間第一部分:I love linux !\n
模式空間第二部分:null
執行後面的替換 “s/\([^ ]* \)\(.*\n\)/&\2\1/;”
模式空間第一部分:I love linux !\n
模式空間第二部分:love linux !\nI
模式空間第三部分:null
執行 ”//D; “//匹配空行執行D刪除模式空間第一部分
模式空間第一部分:love linux !\nI
模式空間第二部分:null
因為還有內容,返回前面命令

第二次"/\n/!G;"有\n不執行,內容不變
模式空間第一部分:love linux !\nI
模式空間第二部分:null
執行後面的替換 “s/\([^ ]* \)\(.*\n\)/&\2\1/;”
模式空間第一部分:love linux !\n
模式空間第二部分:linux !\nlove I
模式空間第三部分:null
執行 ”//D; “//匹配空行執行D刪除最上一行
模式空間第一部分:linux !\nlove I
模式空間第二部分:null
因為還有內容,返回前面命令

第三次"/\n/!G;"有\n不知行,內容不變
模式空間第一部分:linux !\nlove I
模式空間第二部分:null
執行後面的替換 “s/\([^ ]* \)\(.*\n\)/&\2\1/;”
模式空間第一部分:linux !\n
模式空間第二部分:!\nlinux love I
模式空間第三部分:null
執行 ”//D;“ //匹配空行執行D刪除最上一行
模式空間第一部分:!\nlinux love I
模式空間第二部分:null
因為還有內容,返回前面命令

第四次"/\n/!G;"有\n不知行,內容不變
模式空間第一部分:!\nlinux love I
模式空間第二部分:null
執行後面的替換 “s/\([^ ]* \)\(.*\n\)/&\2\1/;” 因為!後面沒有空格所以不匹配,不執行
模式空間第一部分:!\nlinux love I
模式空間第二部分:null
執行 ”//D;“ //匹配空行執行D刪除最上一行
模式空間:null

此時模式空間中為空結束循環,此時若沒有 ”s/\n/ / “則應該打印
!\nlinux love I

因為有”s/\n/ / “,所以再此處將!\nlinux love I作為”s/\n/ / “的輸入內容,執行替換,最後結果
! linux love I

Copyright © Linux教程網 All Rights Reserved