日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三十分钟学会SED

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三十分钟学会SED 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文承接之前寫的三十分鐘學會AWK一文,在學習完AWK之后,趁熱打鐵又學習了一下SED,不得不說這兩個工具真的堪稱文本處理神器,誰用誰知道!本文大部分內容依舊是翻譯自Tutorialspoint上的入門教程,這次是 Sed Tutorial 一文,內容做了一些刪減和補充,增加了一些原文中沒有提及到的語法和命令的講解,并且對原文所有的示例都一一進行了驗證,希望本文對大家學習和了解Sed有所幫助。

文中用到的測試文件可以在 https://github.com/mylxsw/sed-demo找到。

本文將會持續修正和更新,最新內容請參考我的 GITHUB 上的 程序猿成長計劃 項目,歡迎 Star。

概述

SED的英文全稱是 Stream EDitor,它是一個簡單而強大的文本解析轉換工具,在1973-1974年期間由貝爾實驗室的Lee E. McMahon開發,今天,它已經運行在所有的主流操作系統上了。

McMahon創建了一個通用的行編輯器,最終變成為了SED。SED的很多語法和特性都借鑒了ed編輯器。設計之初,它就已經支持正則表達式,SED可以從文件中接受類似于管道的輸入,也可以接受來自標準輸入流的輸入。

SED由自由軟件基金組織(FSF)開發和維護并且隨著GNU/Linux進行分發,因此,通常它也稱作 GNU SED。對于新手來說,SED的語法看起來可能有些神秘,但是,一旦掌握了它的語法,你就可以只用幾行代碼去解決非常復雜的任務,這就是SED的魅力所在。

SED的典型用途

SED的用途非常廣泛,例如:

  • 文本替換

  • 選擇性的輸出文本文件

  • 從文本文件的某處開始編輯

  • 無交互式的對文本文件進行編輯等

工作流

在本章中,我們將會探索SED是如何工作的,要想成為一個SED專家,你需要知道它的內部實現。SED遵循簡單的工作流:讀取執行顯示,下圖描述了該工作流:

  • 讀取: SED從輸入流(文件,管道或者標準輸入)中讀取一行并且存儲到它叫做 模式空間(pattern buffer) 的內部緩沖區

  • 執行: 默認情況下,所有的SED命令都在模式空間中順序的執行,除非指定了行的地址,否則SED命令將會在所有的行上依次執行

  • 顯示: 發送修改后的內容到輸出流。在發送數據之后,模式空間將會被清空。

  • 在文件所有的內容都被處理完成之前,上述過程將會重復執行

需要注意的幾點

  • 模式空間 (pattern buffer) 是一塊活躍的緩沖區,在sed編輯器執行命令時它會保存待檢查的文本

  • 默認情況下,所有的SED命令都是在模式空間中執行,因此輸入文件并不會發生改變

  • 還有另外一個緩沖區叫做 保持空間 (hold buffer),在處理模式空間中的某些行時,可以用保持空間來臨時保存一些行。在每一個循環結束的時候,SED將會移除模式空間中的內容,但是該緩沖區中的內容在所有的循環過程中是持久存儲的。SED命令無法直接在該緩沖區中執行,因此SED允許數據在 保持空間模式空間之間切換

  • 初始情況下,保持空間模式空間 這兩個緩沖區都是空的

  • 如果沒有提供輸入文件的話,SED將會從標準輸入接收請求

  • 如果沒有提供地址范圍的話,默認情況下SED將會對所有的行進行操作

示例

讓我們創建一個名為 quote.txt 的文本文件,文件內容為著名作家Paulo Coelho的一段名言

$ vi quote.txt There is only one thing that makes a dream impossible to achieve: the fear of failure. - Paulo Coelho, The Alchemist

為了理解SED的工作流,我們首先使用SED顯示出quote.txt文件的內容,該示例與cat命令類似

$ sed '' quote.txt There is only one thing that makes a dream impossible to achieve: the fear of failure. - Paulo Coelho, The Alchemist

在上面的例子中,quote.txt是輸入的文件名稱,兩個單引號是要執行的SED命令。

首先,SED將會讀取quote.txt文件中的一行內容存儲到它的模式空間中,然后會在該緩沖區中執行SED命令。在這里,沒有提供SED命令,因此對該緩沖區沒有要執行的操作,最后它會刪除模式空間中的內容并且打印該內容到標準輸出,很簡單的過程,對吧?

在下面的例子中,SED會從標準輸入流接受輸入

$ sed ''

當上述命令被執行的時候,將會產生下列結果

There is only one thing that makes a dream impossible to achieve: the fear of failure. There is only one thing that makes a dream impossible to achieve: the fear of failure.

在這里,第一行內容是通過鍵盤輸入的內容,第二行是SED輸出的內容。

從SED會話中退出,使用組合鍵ctrl-D (^D)

基礎語法

本章中將會介紹SED中的基本命令和它的命令行使用方法。SED可以用下列兩種方式調用:

sed [-n] [-e] 'command(s)' files sed [-n] -f scriptfile files

第一種方式在命令行中使用單引號指定要執行的命令,第二種方式則指定了包含SED命令的腳本文件。當然,這兩種方法也可以同時使用,SED提供了很多參數用于控制這種行為。

讓我們看看如何指定多個SED命令。SED提供了delete命令用于刪除某些行,這里讓我們刪除第一行,第二行和第五行:

首先,使用cat命令顯示文件內容

$ cat books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

現在,使用SED移除指定的行,為了刪除三行,我們使用-e選項指定三個獨立的命令

$ sed -e '1d' -e '2d' -e '5d' books.txt 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 6) A Game of Thrones, George R. R. Martin, 864

我們還可以將多個SED命令寫在一個文本文件中,然后將該文件作為SED命令的參數,SED可以對模式空間中的內容執行文件中的每一個命令,下面的例子描述了SED的第二種用法

首先,創建一個包含SED命令的文本文件,為了便于理解,我們使用與之前相同的SED命令

$ echo -e "1d\n2d\n5d" > commands.txt $ cat commands.txt 1d 2d 5d

接下來構造一個SED命令去執行該操作

$ sed -f commands.txt books.txt 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 6) A Game of Thrones, George R. R. Martin, 864

標準選項

SED支持下列標準選項:

  • -n 默認情況下,模式空間中的內容在處理完成后將會打印到標準輸出,該選項用于阻止該行為

    $ sed -n '' quote.txt
  • -e 指定要執行的命令,使用該參數,我們可以指定多個命令,讓我們打印每一行兩次:

    $ sed -e '' -e 'p' quote.txtThere is only one thing that makes a dream impossible to achieve: the fear of failure.There is only one thing that makes a dream impossible to achieve: the fear of failure.
    • Paulo Coelho, The Alchemist

    • Paulo Coelho, The Alchemist

  • -f 指定包含要執行的命令的腳本文件

    $ echo "p" > commands$$ sed -n -f commands quote.txtThere is only one thing that makes a dream impossible to achieve: the fear of failure.
    • Paulo Coelho, The Alchemist

GNU選項

這些選項是GNU規范定義的,可能對于某些版本的SED并不支持。

  • -n--quiet, --slient:與標準的-n選項相同

  • -e script--expression=script:與標準的-e選項相同

  • -f script-file--file=script-file:與標準的-f選項相同

  • --follow-symlinks:如果提供該選項的話,在編輯的文件是符號鏈接時,SED將會跟隨鏈接

  • -i[SUFFIX]--in-place[=SUFFIX]:該選項用于對當前文件進行編輯,如果提供了SUFFIX的話,將會備份原始文件,否則將會覆蓋原始文件

  • -l N--line-lenght=N:該選項用于設置行的長度為N個字符

  • --posix:該選項禁用所有的GNU擴展

  • -r--regexp-extended:該選項將啟用擴展的正則表達式

  • -u--unbuffered:指定該選項的時候,SED將會從輸入文件中加載最少的數據,并且更加頻繁的刷出到輸出緩沖區。在編輯tail -f命令的輸出,你不希望等待輸出的時候該選項是非常有用的。

  • -z--null-data:默認情況下,SED對每一行使用換行符分割,如果提供了該選項的話,它將使用NULL字符分割行

循環

與其它編程語言類似,SED提供了用于控制執行流的循環和分支語句。

SED中的循環有點類似于goto語句,SED可以根據標簽(label)跳轉到某一行繼續執行,在SED中,我們可以定義如下的標簽:

:label :start :end :up

在上面的示例中,我們創建了四個標簽。

要跳轉到指定的標簽,使用 b 命令后面跟著標簽名,如果忽略標簽名的話,SED將會跳轉到SED文件的結尾。

b標簽用于無條件的跳轉到指定的label。

為了更好地理解SED中的循環和分支,讓我們創建一個名為books2.txt的文本文件,其中包含一些圖書的標題和作者信息,下面的示例中會合并圖書的標題和作者,使用逗號分隔。之后搜索所有匹配“Paulo”的行,如果匹配的話就在這一行的開頭添加-,否則跳轉到Print標簽,打印出該行內容。

$ cat books2.txt A Storm of Swords George R. R. Martin The Two Towers J. R. R. Tolkien The Alchemist Paulo Coelho The Fellowship of the Ring J. R. R. Tolkien The Pilgrimage Paulo Coelho A Game of Thrones George R. R. Martin$ sed -n ' h;n;H;x s/\n/, / /Paulo/!b Print s/^/- / :Print p' books2.txt A Storm of Swords , George R. R. Martin The Two Towers , J. R. R. Tolkien - The Alchemist , Paulo Coelho The Fellowship of the Ring , J. R. R. Tolkien - The Pilgrimage , Paulo Coelho A Game of Thrones , George R. R. Martin

乍看來上述的代碼非常神秘,讓我們逐步拆解一下

  • 第一行是h;n;H;x這幾個命令,記得上面我們提到的 保持空間 嗎?第一個h是指將當前模式空間中的內容覆蓋到 保持空間中,n用于提前讀取下一行,并且覆蓋當前模式空間中的這一行,H將當前模式空間中的內容追加到 保持空間 中,最后的x用于交換模式空間和保持空間中的內容。因此這里就是指每次讀取兩行放到模式空間中交給下面的命令進行處理

  • 接下來是 s/n/, / 用于將上面的兩行內容中的換行符替換為逗號

  • 第三個命令在不匹配的時候跳轉到Print標簽,否則繼續執行第四個命令

  • :Print僅僅是一個標簽名,而p則是print命令

為了提高可讀性,每一個命令都占了一行,當然,你也可以把所有命令放在一行

$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books2.txt

關于h,H,x命令參考官方手冊 sed, a stream editor 3.6 Less Frequently-Used Commands節

分支

使用 t 命令創建分支。只有當前置條件成功的時候,t 命令才會跳轉到該標簽。

t命令只有在前一個替換(s)命令執行成功的時候才會執行。

讓我們看一些前面章節中的例子,與之前不同的是,這次我們將打印四個連字符"-",而之前是一個。

$ sed -n ' h;n;H;x s/\n/, / :Loop /Paulo/s/^/-/ /----/!t Loop p' books2.txt A Storm of Swords , George R. R. Martin The Two Towers , J. R. R. Tolkien ----The Alchemist , Paulo Coelho The Fellowship of the Ring , J. R. R. Tolkien ----The Pilgrimage , Paulo Coelho A Game of Thrones , George R. R. Martin

在上面的例子中,前面兩行與上一節中講的作用一致,第三行定義了一個Loop標簽,接下來匹配存在“Paulo”的行,如果存在則在最前面添加一個-,接下來是我們這里的重點:

/----/!t Loop這一行首先檢查上面添加-之后是否滿足四個-,如果不滿足則跳轉到Loop繼續執行第三行,這樣不停的追加-,最后如果改行滿足前面有四個-才繼續往下執行。

為了提高可讀性,我們將每一個SED命令獨立一行,我們也可以在同一行中使用:

sed -n 'h;n;H;x; s/\n/, /; :Loop;/Paulo/s/^/-/; /----/!t Loop; p' books.txt

模式空間和保持空間

模式空間

對任何文件的來說,最基本的操作就是輸出它的內容,為了實現該目的,在SED中可以使用print命令打印出模式空間中的內容。

首先創建一個包含行號,書名,作者和頁碼數的文件,在本文中我們將會使用該文件,你也可以創建任何其它的文件,但是這里我們就創建一個包含以下內容的文件

$ vi books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho,288 6) A Game of Thrones, George R. R. Martin, 864

執行p命令

$ sed 'p' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864 6) A Game of Thrones, George R. R. Martin, 864

你可能會疑惑,為什么每一行被顯示了兩次?

你還記得SED的工作流嗎?默認情況下,SED將會輸出模式空間中的內容,另外,我們的命令中包含了輸出命令p,因此每一行被打印兩次。但是不要擔心,SED提供了-n參數用于禁止自動輸出模式空間的每一行的行為

$ sed -n 'p' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

行尋址

默認情況下,在SED中使用的命令會作用于文本數據的所有行。如果只想將命令作用于特定的行或者某些行,則需要使用 行尋址 功能。

在SED中包含兩種形式的行尋址:

  • 以數字形式表示的行區間

  • 以文本模式來過濾行

兩種形式都使用相同的語法格式

[address]command

數字方式的行尋址

在下面的示例中SED只會對第3行進行操作

$ sed -n '3p' books.txt 3) The Alchemist, Paulo Coelho, 197

當然,我們還可以讓SED輸出某些行。在SED中使用逗號,分隔輸出行號的范圍,例如下面的代碼會輸出出2-5行的內容

$ sed -n '2,5 p' books.txt 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288

特殊字符 $ 代表了文件的最后一行,輸出文件的最后一行

$ sed -n '$ p' books.txt 6) A Game of Thrones, George R. R. Martin, 864

也可以使用 $ 指定輸出的地址范圍,下列命令輸出第三行到最后一行

$ sed -n '3,$ p' books.txt 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho,288 6) A Game of Thrones, George R. R. Martin, 864

SED還提供了另外兩種操作符用于指定地址范圍,第一個是加號(+)操作符,它可以與逗號(,)操作符一起使用,例如 M, +n 將會打印出從第M行開始的下n行。下面的示例將會輸出第二行開始的下面四行

$ sed -n '2,+4 p' books.txt 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

我們還可以使用波浪線操作符(~)指定地址范圍,它使用M~N的形式,它告訴SED應該處理M行開始的每N行。例如,50~5匹配行號50,55,60,65等,讓我們只輸出文件中的奇數行

$ sed -n '1~2 p' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288

下面的代碼則是只輸出文件中的偶數行

$ sed -n '2~2 p' books.txt 2) The Two Towers, J. R. R. Tolkien, 352 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 6) A Game of Thrones, George R. R. Martin, 864

注意,如果使用的是Mac系統自帶的sed命令,可能不支持~+操作符。可以使用brew install gnu-sed --with-default-names重新安裝GNU-SED。

使用文本模式過濾器

SED編輯器允許指定文本模式來過濾出命令要作用的行。格式如下:

/pattern/command

必須用正斜線將要指定的pattern封起來。sed編輯器會將該命令作用到包含指定文本模式的行上。

下面的示例中,將會輸出所有作者為Paulo Coelho的書籍。

$ sed -n '/Paulo/ p' books.txt 3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288

模式匹配也可以與數字形式的尋址同時使用,在下面的示例會從第一次匹配到Alchemist開始輸出,直到第5行為止。

$ sed -n '/Alchemist/, 5 p' books.txt 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288

使用逗號(,)操作符指定匹配多個匹配的模式。下列的示例將會輸出Two和Pilgrimage之間的所有行

$ sed -n '/Two/, /Pilgrimage/ p' books.txt 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288

在使用文本模式過濾器的時候,與數字方式的行尋址類似,可以使用加號操作符 +,它會輸出從當前匹配位置開始的某幾行,下面的示例會從第一次Two出現的位置開始輸出接下來的4行

$ sed -n '/Two/, +4 p' books.txt 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

保持空間

在處理模式空間中的某些行時,可以用保持空間來臨時保存一些行。有5條命令可用來操作保持空間

命令描述
h將模式空間復制到保持空間
H將模式空間附加到保持空間
g將保持空間復制到模式空間
G將保持空間附加到模式空間
x交換模式空間和保持空間的內容

關于保持空間這里就不在舉例了,前面再循環部分講解下面這個命令的時候我們已經對它的使用做了說明。

$ sed -n 'h;n;H;x;s/\n/, /;/Paulo/!b Print; s/^/- /; :Print;p' books2.txt

基本命令

本章將會講解一些常用的SED命令,主要包括DELETE,WRITE,APPEND,CHANGE,INSERT,TRANSLATE,QUIT,READ,EXECUTE等命令。

刪除命令 d

刪除命令格式如下

[address1[,address2]]d

address1和address2是開始和截止地址,它們可以是行號或者字符串匹配模式,這兩種地址都是可選的。

由命令的名稱可以知道,delete 命令是用來執行刪除操作的,并且因為SED是基于行的編輯器,因此我們說該命令是用來刪除行的。注意的是,該命令只會移除模式空間中的行,這樣該行就不會被發送到輸出流,但原始內容不會改變。

$ sed 'd' books.txt

為什么沒有輸出任何內容?默認情況下,SED將會對每一行執行刪除操作,這就是該命令為什么沒有在標準輸出中輸出任何內容的原因。

下列命令只移除第四行

[jerry]$ sed '4d' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

SED也接受使用逗號(,)分隔的地址范圍。我們可以構造地址范圍去移除N1到N2行,例如,下列命令將刪除2-4行

$ sed '2, 4 d' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

SED的地址范圍并不僅僅限于數字,我們也可以指定模式匹配作為地址,下面的示例會移除所有作者為Paulo Coelho的書籍

$ sed '/Paulo Coelho/d' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 6) A Game of Thrones, George R. R. Martin, 864

我移除所有以Storm和Fellowship開頭的行

$ sed '/Storm/,/Fellowship/d' books.txt 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

文件寫入命令 w

SED提供了 write 命令用于將模式空間中的內容寫入到文件,與 delete 命令類似,下面是 write 命令的語法

[address1[,address2]]w file

w 指定是寫命令, file 指的是存儲文件內容的文件名。使用 file 操作符的時候要小心,當提供了文件名但是文件不存在的時候它會自動創建,如果已經存在的話則會覆蓋原文件的內容。

下面的SED命令會創建文件books.txt的副本,在 wfile 之間只能有一個空格

$ sed -n 'w books.bak' books.txt

上述命令創建了一個名為 books.bak 的文件,驗證一下兩個文件的內容是否相同

$ diff books.txt books.bak $ echo $?

一旦執行上述的代碼,你將會得到下列輸出

0

聰明的你可能已經想到了,這不就是 cp 命令做的事情嗎!確實如此,cp 命令也做了同一件事情,但是SED是一個成熟的工具,使用它你可以只復制文件中的某些行到新的文件中,如下代碼會存儲文件中的奇數行到另一個文件

$ sed -n '2~2 w junk.txt' books.txt $ cat junk.txt 2) The Two Towers, J. R. R. Tolkien, 352 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 6) A Game of Thrones, George R. R. Martin, 864

假設你希望存儲所有獨立作者的書到單獨的文件。如果人工去做的話,肯定是非常無聊而且沒有技術含量的,但是使用SED,你就有了更加聰明的方法去實現

$ sed -n -e '/Martin/ w Martin.txt' -e '/Paulo/ w Paulo.txt' -e '/Tolkien/ w Tolkien.txt' books.txt $ cat Martin.txt 1) A Storm of Swords, George R. R. Martin, 1216 6) A Game of Thrones, George R. R. Martin, 864$ cat Paulo.txt 3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288$ cat Tolkien.txt 2) The Two Towers, J. R. R. Tolkien, 352 4) The Fellowship of the Ring, J. R. R. Tolkien, 432

追加命令 a

文本追加命令語法:

[address]a\ Append text

在第四行之后追加一本新書:

$ sed '4 a 7) Adultry, Paulo Coelho, 234' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 7) Adultry, Paulo Coelho, 234 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

在命令部分,4指的是行號,a 是append命令,剩余部分為要追加的文本。

在文件的結尾插入一行文本,使用 $ 作為地址

$ sed '$ a 7) Adultry, Paulo Coelho, 234' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864 7) Adultry, Paulo Coelho, 234

除了行號,我們也可以使用文本模式指定地址,例如,在匹配 The Alchemist 的行之后追加文本

$ sed '/The Alchemist/ a 7) Adultry, Paulo Coelho, 234' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 7) Adultry, Paulo Coelho, 234 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

行替換命令 c

SED通過 c 提供了 changereplace 命令,該命令幫助我們使用新文本替換已經存在的行,當提供行的地址范圍時,所有的行都被作為一組被替換為單行文本,下面是該命令的語法

[address1[,address2]]c\ Replace text

比如,替換文本中的第三行為新的內容

$ sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) Adultry, Paulo Coelho, 324 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

SED也接受模式作為地址

$ sed '/The Alchemist/ c 3) Adultry, Paulo Coelho, 324' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) Adultry, Paulo Coelho, 324 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

多行替換也是支持的,下面的命令實現了將第4-6行內容替換為單行

$ sed '4, 6 c 4) Adultry, Paulo Coelho, 324' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) Adultry, Paulo Coelho, 324

插入命令 i

插入命令與追加命令類似,唯一的區別是插入命令是在匹配的位置前插入新的一行。

[address]i\ Insert text

下面的命令會在第四行前插入新的一行

$ sed '4 i 7) Adultry, Paulo Coelho, 324' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 7) Adultry, Paulo Coelho, 324 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

轉換命令 y

轉換(Translate)命令 y 是唯一可以處理單個字符的sed編輯器命令。轉換命令格式 如下

[address]y/inchars/outchars/

轉換命令會對inchars和outchars值進行一對一的映射。inchars中的第一個字符會被轉換為outchars中的第一個字符,第二個字符會被轉換成outchars中的第二個字符。這個映射過程會一直持續到處理完指定字符。如果inchars和outchars的長度不同,則sed編輯器會產生一 條錯誤消息。

$ echo "1 5 15 20" | sed 'y/151520/IVXVXX/' I V IV XX

輸出隱藏字符命令 l

你能通過直接觀察區分出單詞是通過空格還是tab進行分隔的嗎?顯然是不能的,但是SED可以為你做到這點。使用l命令(英文字母L的小寫)可以顯示文本中的隱藏字符(例如t或者$字符)。

[address1[,address2]]l [address1[,address2]]l [len]

為了測試該命令,我們首先將books.txt中的空格替換為tab。

$ sed 's/ /\t/g' books.txt > junk.txt

接下來執行l命令

$ sed -n 'l' junk.txt 1)\tStorm\tof\tSwords,\tGeorge\tR.\tR.\tMartin,\t1216\t$ 2)\tThe\tTwo\tTowers,\tJ.\tR.\tR.\tTolkien,\t352\t$ 3)\tThe\tAlchemist,\tPaulo\tCoelho,\t197\t$ 4)\tThe\tFellowship\tof\tthe\tRing,\tJ.\tR.\tR.\tTolkien,\t432\t$ 5)\tThe\tPilgrimage,\tPaulo\tCoelho,\t288\t$ 6)\tA\tGame\tof\tThrones,\tGeorge\tR.\tR.\tMartin,\t864$

使用l命令的時候,一個很有趣的特性是我們可以使用它來實現文本按照指定的寬度換行。

$ sed -n 'l 25' books.txt 1) Storm of Swords, Geor\ ge R. R. Martin, 1216 $ 2) The Two Towers, J. R.\R. Tolkien, 352 $ 3) The Alchemist, Paulo \ Coelho, 197 $ 4) The Fellowship of the\Ring, J. R. R. Tolkien,\432 $ 5) The Pilgrimage, Paulo\Coelho, 288 $ 6) A Game of Thrones, Ge\ orge R. R. Martin, 864$

上面的示例中在l命令后跟了一個數字25,它告訴SED按照每行25個字符進行換行,如果指定這個數字為0的話,則只有在存在換行符的情況下才進行換行。

l命令是GNU-SED的一部分,其它的一些變體中可能無法使用該命令。

退出命令 q

在SED中,可以使用Quit命令退出當前的執行流

[address]q [address]q [value]

需要注意的是,q命令不支持地址范圍,只支持單個地址匹配。默認情況下SED會按照讀取、執行、重復的工作流執行,但當它遇到q命令的時候,它會退出當前的執行流。

$ sed '3 q' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197$ sed '/The Alchemist/ q' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197

q命令也支持提供一個value,這個value將作為程序的返回代碼返回

$ sed '/The Alchemist/ q 100' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197$ echo $? 100

文件讀取命令 r

在SED中,我們可以讓SED使用Read命令從外部文件中讀取內容并且在滿足條件的時候顯示出來。

[address]r file

需要注意的是,r命令和文件名之間必須只有一個空格。

下面的示例會打開junk.txt文件,將其內容插入到books.txt文件的第三行之后

$ echo "This is junk text." > junk.txt $ sed '3 r junk.txt' books.txt 1) A Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 This is junk text. 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

r命令也支持地址范圍,例如3, 5 r junk.txt會在第三行,第四行,第五行后面分別插入junk.txt的內容

執行外部命令 e

如果你看過三十分鐘學會AWK一文,你可能已經知道了在AWK中可以執行外部的命令,那么在SED中我們是否也可以這樣做?

答案是肯定的,在SED中,我們可以使用e命令執行外部命令

[address1[,address2]]e [command]

下面的命令會在第三行之前執行date命令

$ sed '3 e date' books.txt 1) Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 2016年11月29日 星期二 22時46分14秒 CST 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

另一個示例

$ sed '3,5 e who' books.txt 1) Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 mylxsw console Nov 29 19:30 mylxsw ttys000 Nov 29 22:45 3) The Alchemist, Paulo Coelho, 197 mylxsw console Nov 29 19:30 mylxsw ttys000 Nov 29 22:45 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 mylxsw console Nov 29 19:30 mylxsw ttys000 Nov 29 22:45 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

如果你仔細觀察e命令的語法,你會發現其實它的command參數是可選的。在沒有提供外部命令的時候,SED會將模式空間中的內容作為要執行的命令。

$ echo -e "date\ncal\nuname" > commands.txt $ cat commands.txt date cal uname $ sed 'e' commands.txt 2016年11月29日 星期二 22時50分30秒 CST十一月 2016 日 一 二 三 四 五 六1 2 3 4 56 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30Darwin

排除命令 !

感嘆號命令(!)用來排除命令,也就是讓原本會起作用的命令不起作用。

$ sed -n '/Paulo/p' books.txt 3) The Alchemist, Paulo Coelho, 197 5) The Pilgrimage, Paulo Coelho, 288 $ sed -n '/Paulo/!p' books.txt 1) Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 6) A Game of Thrones, George R. R. Martin, 864

如上例所示,p命令原先是只輸出匹配Paulo的行,添加!之后,變成了只輸出不匹配Paulo的行。

$ sed -n '1!G; h; $p' books.txt 6) A Game of Thrones, George R. R. Martin, 864 5) The Pilgrimage, Paulo Coelho, 288 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 3) The Alchemist, Paulo Coelho, 197 2) The Two Towers, J. R. R. Tolkien, 352 1) Storm of Swords, George R. R. Martin, 1216

上面的命令實現了類似tac命令類似的輸出,將文本內容倒序輸出。看起來有些晦澀難懂,分解一下卻十分簡單:

  • 1!G 這句的意思是出了第一行之外,處理每一行的時候都將保持空間中的內容追加到模式空間(正序->倒序)

  • h 將模式空間中的內容復制到保持空間以備下一行匹配的時候追加到下一行的后面

  • $p 如果匹配到最后一行的話則輸出模式空間中的內容

  • 上述步驟不斷重復直到文本結束剛好將文件內容翻轉了一次

  • 多行命令

    在使用sed編輯器的基礎命令時,你可能注意到了一個局限。所有的sed編輯器命令都是針對單行數據執行操作的。在sed編輯器讀取數據流時,它會基于換行符的位置將數據分成行。sed編輯器根據定義好的腳本命令一次處理一行數據,然后移到下一行重復這個過程。

    幸運的是,sed編輯器的設計人員已經考慮到了這種情況,并設計了對應的解決方案。sed編輯器包含了三個可用來處理多行文本的特殊命令。

    • N:將數據流中的下一行加進來創建一個多行組來處理

    • D:刪除多行組中的一行

    • P:打印多行組中的一行

    N - 加載下一行

    默認情況下,SED是基于單行進行操作的,有些情況下我們可能需要使用多行進行編輯,啟用多行編輯使用N命令,與n不同的是,N并不會清除、輸出模式空間的內容,而是采用了追加模式。

    [address1[,address2]]N

    下面的示例將會把books2.txt中的標題和作者放到同一行展示,并且使用逗號進行分隔

    $ sed 'N; s/\n/,/g' books2.txt A Storm of Swords ,George R. R. Martin The Two Towers ,J. R. R. Tolkien The Alchemist ,Paulo Coelho The Fellowship of the Ring ,J. R. R. Tolkien The Pilgrimage ,Paulo Coelho A Game of Thrones ,George R. R. Martin

    D - 刪除多行中的一行

    sed編輯器提供了多行刪除命令D,它只刪除模式空間中的第一行。該命令會刪除到換行符(含 換行符)為止的所有字符。

    $ echo '\nThis is the header line.\nThis is a data line.\n\nThis is the last line.' | sed '/^$/{N; /header/D}' This is the header line. This is a data line.This is the last line.

    P - 輸出多行中的一行

    P命令用于輸出N命令創建的多行文本的模式空間中的第一行。

    [address1[,address2]]P

    例如下面的命令只輸出了圖書的標題

    $ sed -n 'N;P' books2.txt A Storm of Swords The Two Towers The Alchemist The Fellowship of the Ring The Pilgrimage A Game of Thrones

    其它命令

    n - 單行next

    小寫的n命令會告訴sed編輯器移動到數據流中的下一文本行,并且覆蓋當前模式空間中的行。

    $ cat data1.txt This is the header line.This is a data line.This is the last line. $ sed '/header/{n ; d}' data1.txt This is the header line. This is a data line.This is the last line.

    上面的命令中,首先會匹配包含header的行,之后將移動到數據流的下一行,這里是一個空行,然后執行d命令對改行進行刪除,所有就看到了這樣的結果:第一個空行被刪除掉了。

    v - SED版本檢查

    v命令用于檢查SED的版本,如果版本大于參數中的版本則正常執行,否則失敗

    [address1[,address2]]v [version]

    例如

    $ sed --version sed (GNU sed) 4.2.2$ sed 'v 4.2.3' books.txt sed: -e expression #1, char 7: expected newer version of sed$ sed 'v 4.2.2' books.txt 1) Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

    特殊字符

    在SED中提供了兩個可以用作命令的特殊字符:=&

    =命令

    =命令用于輸出行號,語法格式為

    [/pattern/]= [address1[,address2]]=

    例如為每一行輸出行號

    $ sed '=' books2.txt 1 A Storm of Swords 2 George R. R. Martin ...

    只為1-4行輸出行號

    $ sed '1, 4=' books2.txt 1 A Storm of Swords 2 George R. R. Martin 3 The Two Towers 4 J. R. R. Tolkien The Alchemist Paulo Coelho The Fellowship of the Ring J. R. R. Tolkien The Pilgrimage Paulo Coelho A Game of Thrones George R. R. Martin

    匹配Paulo的行輸出行號

    $ sed '/Paulo/ =' books2.txt A Storm of Swords George R. R. Martin The Two Towers J. R. R. Tolkien The Alchemist 6 Paulo Coelho The Fellowship of the Ring J. R. R. Tolkien The Pilgrimage 10 Paulo Coelho A Game of Thrones George R. R. Martin

    最后一行輸出行號,這個命令比較有意思了,可以用于輸出文件總共有多少行

    $ sed -n '$ =' books2.txt 12

    &命令

    特殊字符&用于存儲匹配模式的內容,通常與替換命令s一起使用。

    $ sed 's/[[:digit:]]/Book number &/' books.txt Book number 1) Storm of Swords, George R. R. Martin, 1216 Book number 2) The Two Towers, J. R. R. Tolkien, 352 Book number 3) The Alchemist, Paulo Coelho, 197 Book number 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 Book number 5) The Pilgrimage, Paulo Coelho, 288 Book number 6) A Game of Thrones, George R. R. Martin, 864

    上述命令用于匹配每一行第一個數字,在其前面添加 Book number 。而下面這個命令則匹配最后一個數字,并修改為Pages =。其中[[:digit:]]* *$可能比較費解,這一部分其實是:匹配0個或多個數字+0個或多個空格+行尾。

    sed 's/[[:digit:]]* *$/Pages = &/' books.txt 1) Storm of Swords, George R. R. Martin, Pages = 1216 2) The Two Towers, J. R. R. Tolkien, Pages = 352 3) The Alchemist, Paulo Coelho, Pages = 197 4) The Fellowship of the Ring, J. R. R. Tolkien, Pages = 432 5) The Pilgrimage, Paulo Coelho, Pages = 288 6) A Game of Thrones, George R. R. Martin, Pages = 864

    字符串

    替換命令 s

    文本替換命令非常常見,其格式如下

    [address1[,address2]]s/pattern/replacement/[flags]

    在前面我們使用的books.txt文件中,我們使用逗號“,”分隔每一列,下面的示例中,我們會使用替換命令將其替換為管道符“|”:

    $ sed 's/,/ |/' books.txt 1) Storm of Swords | George R. R. Martin, 1216 2) The Two Towers | J. R. R. Tolkien, 352 3) The Alchemist | Paulo Coelho, 197 4) The Fellowship of the Ring | J. R. R. Tolkien, 432 5) The Pilgrimage | Paulo Coelho, 288 6) A Game of Thrones | George R. R. Martin, 864

    是不是覺得哪里不對?相信你已經發現,每一行的第二個逗號都沒有被替換,只有第一個被替換了,確實如此,在SED中,使用替換命令的時候默認只會對第一個匹配的位置進行替換。使用g選項告訴SED對所有內容進行替換:

    $ sed 's/,/ | /g' books.txt 1) Storm of Swords | George R. R. Martin | 1216 2) The Two Towers | J. R. R. Tolkien | 352 3) The Alchemist | Paulo Coelho | 197 4) The Fellowship of the Ring | J. R. R. Tolkien | 432 5) The Pilgrimage | Paulo Coelho | 288 6) A Game of Thrones | George R. R. Martin | 864

    如果對匹配模式(或地址范圍)的行進行替換,則只需要在s命令前添加地址即可。比如只替換匹配The Pilgrimage的行: sed '/The Pilgrimage/ s/,/ | /g' books.txt

    還有一些其它的選項,這里就簡單的描述一下,不在展開講解

    • 數字n: 只替換第n次匹配,比如sed 's/,/ | /2' books.txt,只替換每行中第二個逗號

    • p:只輸出改變的行,比如sed -n 's/Paulo Coelho/PAULO COELHO/p' books.txt

    • w:存儲改變的行到文件,比如sed -n 's/Paulo Coelho/PAULO COELHO/w junk.txt' books.txt

    • i:匹配時忽略大小寫,比如sed -n 's/pAuLo CoElHo/PAULO COELHO/pi' books.txt

    在執行替換操作的時候,如果要替換的內容中包含/,這個時候怎么辦?很簡單,添加轉義操作符。

    $ echo "/bin/sed" | sed 's/\/bin\/sed/\/home\/mylxsw\/src\/sed\/sed-4.2.2\/sed/' /home/mylxsw/src/sed/sed-4.2.2/sed

    上面的命令中,我們使用`對/進行了轉義,不過表達式已經看起來非常難看了,在SED中還可以使用|,@,^,!`作為命令的分隔符,所以,下面的幾個命令和上面的是等價的

    echo "/bin/sed" | sed 's|/bin/sed|/mylxsw/mylxsw/src/sed/sed-4.2.2/sed|' echo "/bin/sed" | sed 's@/bin/sed@/home/mylxsw/src/sed/sed-4.2.2/sed@' echo "/bin/sed" | sed 's^/bin/sed^/home/mylxsw/src/sed/sed-4.2.2/sed^' echo "/bin/sed" | sed 's!/bin/sed!/home/mylxsw/src/sed/sed-4.2.2/sed!'

    匹配子字符串

    前面我們學習了替換命令的用法,現在讓我們看看如何獲取匹配文本中的某個子串。

    在SED中,使用(和)對匹配的內容進行分組,使用N的方式進行引用。請看下面示例

    $ echo "Three One Two" | sed 's|\(\w\+\) \(\w\+\) \(\w\+\)|\2 \3 \1|' One Two Three

    我們輸出了Three,One,Two三個單詞,在SED的替換規則中,使用空格分隔了三小段正則表達式(w+)來匹配每一個單詞,后面使用1,,2,3分別引用它們的值。

    管理模式

    前面已經講解過模式空間和保持空間的用法,在本節中我們將會繼續探索它們的用法。

    本部分內容暫未更新,請關注程序猿成長計劃 項目,我將最先在Github的這個倉庫中更新最新內容。

    正則表達式

    這一部分就是標準正則表達式的一些特殊字符以元字符,比較熟悉的請略過。

    標準正則表達式

    ^

    匹配行的開始。

    $ sed -n '/^The/ p' books2.txt The Two Towers, J. R. R. Tolkien The Alchemist, Paulo Coelho The Fellowship of the Ring, J. R. R. Tolkien The Pilgrimage, Paulo Coelho

    $

    匹配行的結尾

    $ sed -n '/Coelho$/ p' books2.txt The Alchemist, Paulo Coelho The Pilgrimage, Paulo Coelho

    .

    匹配單個字符(除行尾)

    $ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p' cat bat rat mat

    []

    匹配字符集

    $ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p' Call Tall

    [^]

    排除字符集

    $ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p' Ball

    [-]

    字符范圍。

    $ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p' Call Tall

    ?\+ ,*

    分別對應0次到1次,一次到多次,0次到多次匹配。

    {n}{n,}{m, n}

    精確匹配N次,至少匹配N次,匹配M-N次

    |

    或操作。

    $ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p' str1 str3

    POSIX兼容的正則

    主要包含[:alnum:],[:alpha:],[:blank:],[:digit:],[:lower:],[:upper:],[:punct:],[:space:],這些基本都見名之意,不在贅述。

    元字符

    s

    匹配單個空白內容

    $ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p' Line 1

    S

    匹配單個非空白內容。

    wW

    單個單詞、非單詞。

    常用代碼段

    Cat命令

    模擬cat命令比較簡單,有下面兩種方式

    $ sed '' books.txt 1) Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864$ sed -n 'p' books.txt 1) Storm of Swords, George R. R. Martin, 1216 2) The Two Towers, J. R. R. Tolkien, 352 3) The Alchemist, Paulo Coelho, 197 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 5) The Pilgrimage, Paulo Coelho, 288 6) A Game of Thrones, George R. R. Martin, 864

    移除空行

    $ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d' Line #1 Line #2

    刪除連續空行

    $ echo -e "Line #1\n\n\nLine #2" | sed '/./,/^$/!d' Line #1Line #2

    刪除開頭的空行

    $ echo -e "\nLine #1\n\nLine #2" | sed '/./,$!d' Line #1Line #2

    刪除結尾的空行

    $ echo -e "\nLine #1\nLine #2\n\n" | sed ':start /^\n*$/{$d; N; b start }'Line #1Line #2

    過濾所有的html標簽

    $ cat html.txt <html> <head><title>This is the page title</title> </head> <body><p> This is the <b>first</b> line in the Web page.This should provide some <i>useful</i> information to use in our sed script. </body> </html> $ sed 's/<[^>]*>//g ; /^$/d' html.txtThis is the page titleThis is the first line in the Web page.This should provide some useful information to use in our sed script.

    從C++程序中移除注釋

    有下面這樣一個cpp文件

    $ cat hello.cpp #include <iostream> using namespace std; int main(void) { // Displays message on stdout. cout >> "Hello, World !!!" >> endl; return 0; // Return success. }

    執行下面的命令可以移除注釋

    $ sed 's|//.*||g' hello.cpp #include <iostream> using namespace std; int main(void) {cout >> "Hello, World !!!" >> endl;return 0;}

    為某些行添加注釋

    $ sed '3,5 s/^/#/' hello.sh #!/bin/bash #pwd #hostname #uname -a who who -r lsb_release -a

    實現Wc -l命令

    wc -l命令用于統計文件中的行數,使用SED也可以模擬該命令

    $ wc -l hello.cpp9 hello.cpp $ sed -n '$ =' hello.cpp 9

    模擬實現head命令

    head命令用于輸出文件中的前10行內容。

    $ head books2.txt A Storm of Swords George R. R. Martin The Two Towers J. R. R. Tolkien The Alchemist Paulo Coelho The Fellowship of the Ring J. R. R. Tolkien The Pilgrimage Paulo Coelho

    使用SED中的sed '10 q'可以模擬它的實現

    $ sed '10 q' books.txt A Storm of Swords George R. R. Martin The Two Towers J. R. R. Tolkien The Alchemist Paulo Coelho The Fellowship of the Ring J. R. R. Tolkien The Pilgrimage Paulo Coelho

    模擬tail -1命令

    tail -1輸出文件的最后一行。

    $ cat test.txt Line #1 Line #2 $ tail -1 test.txt Line #2 $ sed $ sed -n '$p' test.txt Line #2

    模擬Dos2unix命令

    在DOS環境中,換行符是使用CR/LF兩個字符一起表示的,下面命令模擬了dos2unix命令轉換這些換行符為UNIX換行符。

    在GNU/Linux環境中,CR/LF通常使用"^M"(不是簡單的兩個符號組合,請使用快捷鍵Ctrl+v,Ctrl+m輸入)進行表示。

    $ echo -e "Line #1\r\nLine #2\r" > test.txt $ file test.txt test.txt: ASCII text, with CRLF line terminators $ sed 's/^M$//' test.txt > new.txt $ file new.txt new.txt: ASCII text $ cat -vte new.txt Line #1$ Line #2$

    模擬Unix2dos命令

    $ file new.txt new.txt: ASCII text $ sed 's/$/\r/' new.txt > new2.txt $ file new2.txt new2.txt: ASCII text, with CRLF line terminators$ cat -vte new2.txt Line #1^M$ Line #2^M$

    模擬cat -E命令

    cat -E命令會在每一行的行尾輸出一個$符號。

    $ echo -e "Line #1\nLine #2" | cat -E Line #1$ Line #2$ $ echo -e "Line #1\nLine #2" | sed 's|$|&$|' Line #1$ Line #2$

    注意,在Mac下不支持cat -E,可以直接使用sed代替

    模擬cat -ET命令

    cat -ET命令不僅對每一行的行尾添加$,還會將每一行中的TAB顯示為^I。

    $ echo -e "Line #1\tLine #2" | cat -ET Line #1^ILine #2$ $ echo -e "Line #1\tLine #2" | sed -n 'l' | sed 'y/\\t/^I/' Line #1^ILine #2$

    模擬nl命令

    命令nl可以為輸入內容的每一行添加行號,記得之前介紹的=操作符吧,在SED中我們可以用它來實現與nl命令類似的功能。

    $ echo -e "Line #1\nLine #2" |nl1 Line #12 Line #2 $ echo -e "Line #1\nLine #2" | sed = | sed 'N;s/\n/\t/' 1 Line #1 2 Line #2

    上面的SED命令使用了兩次,第一次使用=操作符為每一行輸出行號,注意這個行號是獨占一行的,因此使用管道符連接了第二個SED命令,每次讀取兩行,將換行符替換為Tab,這樣就模擬出了nl命令的效果。

    模擬cp命令

    $ sed -n 'w dup.txt' data.txt $ diff data.txt dup.txt $ echo $? 0

    模擬expand命令

    expand命令會轉換輸入中的TAB為空格,在SED中也可以模擬它

    $ echo -e "One\tTwo\tThree" > test.txt $ expand test.txt > expand.txt $ sed 's/\t/ /g' test.txt > new.txt $ diff new.txt expand.txt $ echo $? 0

    模擬tee命令

    tee命令會將數據輸出到標準輸出的同時寫入文件。

    $ echo -e "Line #1\nLine #2" | tee test.txt Line #1 Line #2

    在SED中,實現該命令非常簡單

    $ sed -n 'p; w new.txt' test.txt One Two Three

    模擬cat -s命令

    cat -s命令會將輸入文件中的多行空格合并為一行。

    $ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" | cat -s Line #1Line #2Line #3

    在SED中實現

    $ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" | sed '1s/^$//p;/./,/^$/!d' Line #1Line #2Line #3

    這里需要注意的是/./,/^$/!d這個命令,它的意思是匹配區間/./到/^$,區間的開始會匹配至少包含一個字符的行,結束會匹配一個空行,在這個區間中的行不會被刪除。

    模擬grep命令

    $ echo -e "Line #1\nLine #2\nLine #3" | grep 'Line #1' Line #1 $ echo -e "Line #1\nLine #2\nLine #3" | sed -n '/Line #1/p' Line #1

    模擬grep -v命令

    $ echo -e "Line #1\nLine #2\nLine #3" | grep -v 'Line #1' Line #2 Line #3 $ echo -e "Line #1\nLine #2\nLine #3" | sed -n '/Line #1/!p' Line #2 Line #3

    模擬tr命令

    tr命令用于字符轉換

    $ echo "ABC" | tr "ABC" "abc" abc $ echo "ABC" | sed 'y/ABC/abc/' abc

    寫在最后

    看到這里,你肯定要吐槽了,不是說了三十分鐘學會嗎?你確定你能三十分鐘學會?上次的三十分鐘學會AWK說三十分鐘學會不靠譜,這次又不靠譜了。不好意思,這里的三十分鐘其實只是為了吸引你的注意而已,只有在你已經用過SED并對它的一些特性有所了解的情況下三十分鐘看完才是有可能的,畢竟那么多特殊字符,那么多命令需要記住。不過話說回來,看完之后你有收獲嗎?有的話,那本文的目的就達到了,之后用到SED的時候再回來參考一下就可以了。

    本文將會持續修正和更新,最新內容請參考我的 GITHUB 上的 程序猿成長計劃 項目,歡迎 Star。

    參考

    • Sed Tutorial

    • Linux命令行與shell腳本編程大全(第3版)

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的三十分钟学会SED的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    www日韩精品| 成人av在线直播 | 97成人精品视频在线观看 | 久久久久久久久毛片精品 | 制服丝袜欧美 | 欧美美女视频在线观看 | 麻豆传媒电影在线观看 | 国产成人av网站 | 日韩欧美视频免费看 | 美女在线观看av | 美女视频a美女大全免费下载蜜臀 | 国产精品免费人成网站 | 丁香在线| 五月丁婷婷 | 国内丰满少妇猛烈精品播放 | 国产成人av电影在线观看 | 日韩高清成人 | 亚洲精选视频免费看 | 日本69hd| 国产精品99在线播放 | 在线亚洲激情 | 国内精品久久久久久久影视简单 | 免费在线播放视频 | 美女视频黄免费的久久 | 91视频啊啊啊 | 精品久久九九 | 精品久久久久国产免费第一页 | 麻豆va一区二区三区久久浪 | 国产精品视频内 | 青青草久草在线 | 日韩免费专区 | 日本中文字幕在线观看 | 免费看91的网站 | 四虎在线视频免费观看 | 国产精在线 | 96精品视频| 日本中文字幕电影在线免费观看 | 永久精品视频 | 久久久www成人免费毛片麻豆 | 91污视频在线 | 亚洲三级影院 | 国产色综合天天综合网 | 国产九九九精品视频 | 亚洲欧洲久久久 | 公与妇乱理三级xxx 在线观看视频在线观看 | 午夜精品福利一区二区 | www.99在线观看| 国产成人精品亚洲精品 | 天天摸天天弄 | 99在线精品免费视频九九视 | 激情五月在线观看 | 国产aa免费视频 | 激情中文在线 | av三级在线免费观看 | 涩涩爱夜夜爱 | 大胆欧美gogo免费视频一二区 | 久久精品韩国 | 黄色一级大片在线免费看国产一 | 超碰免费在线公开 | 精品一区二区电影 | 欧美一级久久 | 婷婷九月丁香 | 五月天激情综合 | 精品一区二区三区在线播放 | 国产黄色免费在线观看 | 综合影视 | 中文字幕成人一区 | 九色激情网 | 国产超碰97 | 中文字幕的 | 久久av网址| 狠狠干天天色 | 色婷婷综合久久久中文字幕 | 丝袜美腿在线 | 久久精品九色 | 国产99re | 91色在线观看视频 | 久草视频在线资源 | 狠狠艹夜夜干 | 九九免费在线观看 | 中文字幕中文字幕 | 国产精品18久久久 | 中文字幕一区二区三区四区在线视频 | 狠狠色狠狠色合久久伊人 | 成人va天堂 | 亚洲最大在线视频 | 激情深爱 | 久久狠狠一本精品综合网 | 欧美另类视频 | 久久国产精品二国产精品中国洋人 | 日韩理论电影在线 | 亚洲一区欧美激情 | 天天干中文字幕 | 干干干操操操 | 久久久999免费视频 日韩网站在线 | 国产精品白丝jk白祙 | 久久人人97超碰国产公开结果 | 天天射射天天 | 麻豆一区在线观看 | 91黄色免费看 | 日本在线观看一区二区 | 久久中文精品视频 | 91福利试看 | 九九爱免费视频在线观看 | 91视频观看免费 | 欧美成人性战久久 | 国产不卡av在线 | 免费网站黄| 伊人伊成久久人综合网小说 | 久久福利剧场 | 日韩精品一区二区三区免费视频观看 | 成人网大片 | 亚洲综合视频在线播放 | 久久久久网址 | 国产91小视频 | 在线播放一区二区三区 | 日韩精品在线播放 | 久久99久久99 | 国内外成人在线 | 久草在线在线精品观看 | 国外av在线| 亚洲精品在线免费播放 | 久青草视频 | 中文在线字幕观看电影 | 色婷婷综合久久久久 | 97电影院在线观看 | 婷婷丁香五 | av成人资源| 色婷婷视频在线观看 | 中文字幕丰满人伦在线 | 天天操天天干天天干 | 午夜久久视频 | 精品乱码一区二区三四区 | 在线国产能看的 | 人人看人人艹 | 国产不卡精品 | 最近中文字幕国语免费高清6 | 久久综合之合合综合久久 | 久草在线视频在线观看 | 1024手机基地在线观看 | 97精品国产97久久久久久 | 国产视频在线观看一区二区 | 日韩精品黄 | 欧美日韩中文字幕在线视频 | 999超碰| 国产天天爽 | 日本三级不卡视频 | 五月天综合 | 国产视频 亚洲视频 | 国产成人精品在线播放 | 综合国产在线观看 | 激情久久综合网 | 国产精久久久 | 久久婷婷一区二区三区 | 久久久久久久久久久久久久免费看 | 亚洲精品视频中文字幕 | 天天爱天天舔 | 在线观看完整版免费 | 欧美一区二区在线 | 亚洲男模gay裸体gay | 99精品系列| 欧美激情h| 毛片网在线观看 | 日韩电影中文字幕 | 在线一区二区三区 | 亚洲精品美女久久 | 久久久久久久久久久久电影 | 色婷婷激情五月 | 在线观看视频97 | 久草在在线视频 | 天天激情综合 | 日韩欧美黄色网址 | 天天综合网在线 | 香蕉视频亚洲 | 在线电影中文字幕 | 色婷婷成人网 | 国产日韩精品在线 | 免费三级在线 | 久久精品国产亚洲a | 999久久国精品免费观看网站 | 在线播放精品一区二区三区 | 福利视频第一页 | 99在线精品视频观看 | 亚洲精品午夜久久久久久久久久久 | 成人91免费视频 | 91久久久久久久一区二区 | 永久黄网站色视频免费观看w | 97超碰人人模人人人爽人人爱 | 91欧美视频网站 | 99久久精品久久久久久清纯 | 黄av在线| 国产精品涩涩屋www在线观看 | 久久久不卡影院 | 日韩性xxx| 午夜在线观看一区 | 亚洲精品动漫在线 | 亚洲国产精品电影 | 日日麻批40分钟视频免费观看 | 99r在线播放 | 黄色国产高清 | 激情av在线资源 | 日韩欧美精品一区二区 | 国产精品久久久久久69 | 最新日韩视频 | 91成人免费观看视频 | 九九免费精品视频在线观看 | 国产精品影音先锋 | 91精品国产麻豆国产自产影视 | 色亚洲激情 | 亚洲精品88欧美一区二区 | 成人小视频在线 | 色在线亚洲 | 麻豆综合网 | 女人18精品一区二区三区 | 国产午夜亚洲精品 | 超碰97免费观看 | 天天干天天天天 | 日韩视频一二三区 | 久久99九九99精品 | 国产精品久久久一区二区 | 在线观看亚洲免费视频 | 日韩网站免费观看 | 久草精品视频在线播放 | av黄色av | 色a综合| 中文字幕高清视频 | 国产精品久久电影观看 | 亚洲九九爱 | 精品国产伦一区二区三区 | 亚洲资源一区 | 久久免费的精品国产v∧ | 在线观看国产永久免费视频 | 中文字幕在线观看国产 | 91看片在线观看 | 国产高潮久久 | 色多多污污 | 久久国产热视频 | 亚洲激情一区二区三区 | 97电影网站| 黄色av电影免费观看 | 九九综合在线 | 免费一级片在线 | 国产99在线播放 | 国内99视频| 色wwwww| 久久在现 | 久久电影中文字幕视频 | 国产福利精品视频 | 人人爽人人| 日本一区二区三区视频在线播放 | 国产成本人视频在线观看 | 欧洲一区二区在线观看 | 免费观看av | 91最新视频 | 激情av综合| 国产成人精品一区二三区 | 日韩小视频 | 久久99久久久久久 | 国产精品理论视频 | 日韩中文在线观看 | 九九在线视频免费观看 | 欧美另类美少妇69xxxx | 四虎在线观看视频 | 久久久五月天 | 国产成人精品在线播放 | 欧美在线日韩在线 | 亚洲精品国产麻豆 | 99欧美精品 | 激情黄色av | 国产综合小视频 | 伊人久久婷婷 | 美女网站在线播放 | 1024手机在线看 | 玖玖玖在线观看 | 日本公乱妇视频 | 日本久久中文 | 欧美日韩国产伦理 | av福利超碰网站 | 人人爱人人做人人爽 | 国产一卡二卡四卡国 | 亚洲国产精品成人女人久久 | 国产一区二区日本 | 国产高清视频免费在线观看 | 在线观看视频国产一区 | 黄色在线观看污 | 精品一区二区视频 | 婷婷色社区 | 欧美人zozo| 一区二区视频电影在线观看 | 黄网站色成年免费观看 | 国产精品久久免费看 | 韩国av在线播放 | 国产91精品看黄网站 | 午夜精品久久久久久久久久久久 | 久久久久久国产精品美女 | 成人h视频在线播放 | 国产精品久久久av久久久 | 免费三级影片 | 天天操月月操 | 国产精品高潮呻吟久久av无 | 国产99一区二区 | 色婷婷狠狠五月综合天色拍 | 九九热精品视频在线播放 | 久久高视频 | 中文字幕亚洲国产 | 黄色性av | 久一久久 | 91麻豆精品国产自产 | 色偷偷av男人天堂 | a级国产毛片 | 色吧av色av | 久久精品免费播放 | adn—256中文在线观看 | 国产精品青草综合久久久久99 | 欧美激情片在线观看 | a级国产毛片 | 国产亚洲精品久久久久久久久久 | 亚洲在线看 | 在线色网站 | 久久艹欧美 | 人人超在线公开视频 | 久久av影院| 狠狠狠色丁香婷婷综合激情 | 亚洲欧美国产日韩在线观看 | 国产成人久久精品亚洲 | 免费在线观看av电影 | 精品视频在线免费 | avsex| 亚洲最新视频在线播放 | 免费黄色在线播放 | www黄色| 在线视频中文字幕一区 | 久草视频在线免费播放 | 右手影院亚洲欧美 | 91精品一区二区三区蜜臀 | 成人全视频免费观看在线看 | 91视频高清完整版 | 91人人干| 中文字幕在线不卡国产视频 | 久草网站在线观看 | 欧美一级乱黄 | 在线看的av网站 | 热久久国产精品 | 日韩欧美视频免费在线观看 | 色天天综合久久久久综合片 | 中国一级片在线播放 | 日韩免费视频一区二区 | 久久精品aaa | 偷拍福利视频一区二区三区 | 国产精品av一区二区 | 国产黄色精品网站 | 日本在线观看中文字幕无线观看 | 天天曰夜夜操 | 日本婷婷色 | 亚洲涩涩涩涩涩涩 | 91欧美日韩国产 | 久久9999久久免费精品国产 | 人人盈棋牌 | 中文字幕一区二区三区在线视频 | 欧美一区二区精美视频 | 97超在线视频 | 超碰人在线 | 麻豆传媒视频在线免费观看 | 99热在线观看 | 国产精品久久久久久久久久尿 | 黄视频网站大全 | 欧美va在线观看 | 91精品国产99久久久久久久 | 国产精品免费久久久久久 | 国产九九九九九 | 操操日 | 久久永久视频 | 欧美日韩在线视频一区二区 | 欧美日韩午夜 | 国产精品女人久久久久久 | 黄色网在线播放 | 日韩精品2区 | 国产精品久久久久久久久久妇女 | 国产午夜麻豆影院在线观看 | 8090yy亚洲精品久久 | 久人人 | 日本在线h | 91麻豆网站 | 免费在线观看日韩视频 | 成人午夜片av在线看 | 91日韩精品视频 | 免费看一及片 | 国产精品一区二区av日韩在线 | 五月激情片 | 精品国产一区二区三区在线 | 黄色小说网站在线 | 天天躁天天躁天天躁婷 | 97人人超碰在线 | 国产成人精品三级 | 国产小视频网站 | 国产午夜精品久久久久久久久久 | 久草视频免费播放 | 国产精品婷婷午夜在线观看 | 在线视频日韩精品 | 天天玩天天干天天操 | 久久伦理电影网 | 99欧美 | 天堂va欧美va亚洲va老司机 | 国产精品久久久久9999 | 国产免费叼嘿网站免费 | 欧亚日韩精品一区二区在线 | 奇米网网址 | 免费久久网| 福利一区二区三区四区 | 日韩草比| 久久蜜臀av| 婷婷色在线 | 欧美色黄 | 国产在线污 | 日韩免费一区二区在线观看 | 免费av视屏 | 久久最新视频 | 99久久99久久综合 | 国产精品自在线 | 亚洲国产人午在线一二区 | 久久99国产精品二区护士 | 成人免费看电影 | 亚洲天堂香蕉 | 超碰在线最新 | 欧美最猛性xxxxx免费 | 91中文字幕在线观看 | 国产精品18久久久久久久网站 | 国产精品久久久久久久免费大片 | 久久精品中文视频 | 欧美一级高清片 | 96精品高清视频在线观看软件特色 | 日本一区二区三区免费看 | 99国产在线| 亚洲精品资源在线 | 麻豆成人网 | 操久 | 欧美一级免费在线 | 国产视频综合在线 | 亚洲午夜精品一区二区三区电影院 | 久久优 | 在线成人免费av | 国产小视频你懂的 | 国产日韩视频在线 | 免费av黄色 | 国产高清区 | 亚洲成人软件 | 在线视频成人 | 狠狠插天天干 | 久久精品79国产精品 | 91丝袜美腿 | 久久激情精品 | 免费黄色网址大全 | 亚洲免费av电影 | 中文字幕在线观看一区 | 91成人免费看 | 高清在线观看av | 激情在线免费视频 | 在线看欧美 | 亚洲欧美视频一区二区三区 | 亚洲黄色片在线 | 黄色小说18 | 亚洲综合精品视频 | 在线视频久 | 91 在线视频| 不卡的一区二区三区 | 女人18片毛片90分钟 | 国产三级精品三级在线观看 | 日日天天干 | 精品视频中文字幕 | 综合久久精品 | 91污在线 | 成人wwwxxx视频 | 最近更新好看的中文字幕 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 国产尤物一区二区三区 | 在线有码中文字幕 | 日韩三级视频 | 亚洲欧美视屏 | 国产精品久久久久影院 | 91亚洲精品久久久 | 天天操天天是 | 精品专区| 免费观看一级一片 | 国际精品网 | 国产精品第十页 | 国产麻豆剧果冻传媒视频播放量 | 五月天激情在线 | 一 级 黄 色 片免费看的 | 国产免费又黄又爽 | 婷婷深爱网 | 2023av在线 | 亚洲综合色丁香婷婷六月图片 | 黄色免费网站下载 | 麻豆精品视频在线 | 国产日韩精品一区二区三区在线 | 黄色三级免费网址 | 日韩在线高清免费视频 | 欧美性生活大片 | 国产不卡av在线 | 国产在线最新 | 一本一道久久a久久精品蜜桃 | 欧美日韩国产在线精品 | 欧美精品九九 | 亚洲一区二区三区四区精品 | 极品中文字幕 | av丝袜制服 | 精品亚洲一区二区三区 | av日韩在线网站 | 久久精品亚洲 | 免费亚洲黄色 | 99精品成人 | 久久久一本精品99久久精品66 | 99 视频 高清 | 麻豆高清免费国产一区 | 天堂在线视频中文网 | 天堂va欧美va亚洲va老司机 | 免费三级黄色片 | 最近免费观看的电影完整版 | 亚洲精品合集 | 精品久久久久国产免费第一页 | aaa日本高清在线播放免费观看 | av手机版| 亚洲精品五月天 | 天天射日 | 激情开心网站 | 久久精品久久久久电影 | 蜜臀av在线一区二区三区 | 菠萝菠萝在线精品视频 | 美女福利视频一区二区 | 久久久久久久久久久免费视频 | 草久在线观看视频 | 天天亚洲综合 | 日韩视频一区二区三区在线播放免费观看 | 国内久久精品 | 国产剧情一区 | 国产色视频一区二区三区qq号 | 色综合色综合久久综合频道88 | 在线视频国产区 | 国产精品视频全国免费观看 | 天天综合婷婷 | 国产中文字幕视频在线 | av电影免费看 | 精品视频成人 | 色综合中文字幕 | 亚洲精品视频网站在线观看 | 久草在线资源视频 | 亚洲综合婷婷 | 国产专区在线视频 | 在线 视频 亚洲 | 综合天堂av久久久久久久 | 麻豆 videos| av电影在线不卡 | 天天碰天天操视频 | 91人人爽久久涩噜噜噜 | 国产美女免费视频 | 亚洲 欧美 国产 va在线影院 | 99国产精品免费网站 | 色偷偷88888欧美精品久久久 | 天天射网 | 最近日本韩国中文字幕 | 国产精品第二十页 | 99久久精品午夜一区二区小说 | 中文字幕 国产视频 | 国产亚洲精品久久久久久久久久久久 | 成人在线视频论坛 | 日韩欧美一区二区在线 | 黄色a三级 | 日本激情视频中文字幕 | av激情五月 | 国产精品久久久久影院 | 三上悠亚一区二区在线观看 | 日韩城人在线 | 在线观看免费av网站 | 日韩欧美在线一区二区 | 成人 国产 在线 | 亚洲人成人99网站 | 在线播放国产一区二区三区 | 免费裸体视频网 | 亚洲午夜小视频 | 国产97碰免费视频 | 黄色软件网站在线观看 | 在线电影av| 婷婷丁香久久五月婷婷 | 久亚洲 | 99精品久久只有精品 | 91成人国产 | 中文国产成人精品久久一 | 日韩精品中文字幕有码 | 日韩精品久久久久久中文字幕8 | 亚洲影视九九影院在线观看 | 欧美 国产 视频 | 91字幕| 天天艹天天 | 视频在线观看99 | 亚洲国产精品一区二区尤物区 | 免费中文字幕在线观看 | 婷婷丁香六月天 | 96看片| 草久久精品| 久久免费看 | 97涩涩视频 | 久草精品在线观看 | 五月亚洲婷婷 | 国产亚洲成av片在线观看 | 日韩高清成人在线 | 五月开心色 | 亚洲视频456 | 狠狠狠干狠狠 | 精品福利av | 超碰人人超 | 337p西西人体大胆瓣开下部 | 97超碰资源网 | 在线色资源 | 美女免费视频网站 | 日韩网站中文字幕 | 99精品在线免费 | 国产一区二区精品 | 日韩免费在线 | 久草在线一免费新视频 | 色在线国产 | 婷婷av网站 | 亚州精品天堂中文字幕 | 人人澡人摸人人添学生av | 国产精品免费观看国产网曝瓜 | 欧女人精69xxxxxx | 免费av福利 | 久久综合五月天婷婷伊人 | 蜜臀aⅴ国产精品久久久国产 | 人人澡人人爱 | 婷婷色5月 | 久久人人爽人人 | 色综合久久久久综合 | 国产精品成人自产拍在线观看 | 91精品老司机久久一区啪 | 国产成人精品久久亚洲高清不卡 | 成人免费看片98欧美 | 午夜视频在线观看欧美 | 美女黄频免费 | 中文字幕超清在线免费 | 久久精品欧美一 | 伊人天天色 | 国产又黄又爽又猛视频日本 | 日韩欧美高清不卡 | 亚洲一区二区三区在线看 | 国产精品久久久久久久av电影 | 亚洲精品播放 | 中文字幕在线观看91 | 在线免费观看国产黄色 | 青草视频免费观看 | 国产系列 在线观看 | 黄色在线观看免费 | 91九色精品国产 | 国产一区国产二区在线观看 | 毛片网在线播放 | 久久高视频| 91成人网在线播放 | 国产黄色片久久久 | 久久老司机精品视频 | 久久99久久久久 | 婷婷丁香激情 | 国产麻豆电影在线观看 | 精品久久一区二区三区 | 黄色毛片电影 | 久久国产精品99久久久久久丝袜 | 91亚洲国产成人久久精品网站 | 欧美性精品 | 美女在线国产 | 色香蕉在线视频 | 成人性生爱a∨ | 国产精品18毛片一区二区 | 日韩久久片 | 日韩av图片 | 日韩一区精品 | 久久草精品 | 一区二区三区精品在线 | 99视频+国产日韩欧美 | 在线观看亚洲国产 | 天天射天天操天天色 | 中文字幕综合在线 | 欧美精品v国产精品 | 久久99亚洲网美利坚合众国 | 亚洲欧美国产日韩在线观看 | 91中文字幕在线 | 久久精品一区二 | 国产99中文字幕 | www.福利| 国产精品网站 | 国内久久久 | 国产精品欧美久久久久三级 | 91完整版观看 | 九九在线精品视频 | 麻豆免费精品视频 | 中文字幕精品在线 | 久久国产精品视频免费看 | 一区二区 精品 | 伊人中文网 | 国产精品久久久亚洲 | 亚洲一区 影院 | 精品国产一区二区三区久久久久久 | 久久热首页 | 丁香五月亚洲综合在线 | 国产黄色精品在线观看 | 狠狠综合网 | 国产精品青草综合久久久久99 | 色噜噜在线观看视频 | 黄色毛片一级片 | 亚洲无人区小视频 | 日日日天天天 | 日韩av成人免费看 | 欧美日韩久久一区 | 贫乳av女优大全 | 高清在线一区 | 久久久伊人网 | 在线观看国产 | 日三级在线 | 精品久久久久国产 | 国产精品成人久久久久 | 91视频网址入口 | 操操操人人人 | 一区二区视频在线免费观看 | 欧美日韩在线观看一区 | 免费性网站 | 午夜久久网 | 久久国产精品免费视频 | 在线小视频你懂得 | 欧美日韩在线视频一区 | 中文字幕中文字幕 | 国产精品久久伊人 | 精品国产aⅴ一区二区三区 在线直播av | av韩国在线 | 精品九九九九 | 黄色网www| 国产一区欧美在线 | 久久99国产综合精品 | 日韩精品五月天 | 国产精品久久久久亚洲影视 | 99久久久国产精品 | 国产999久久久| 亚洲国产精品500在线观看 | 国产成人在线综合 | 三级av小说 | 香蕉网在线播放 | 成年人在线免费看视频 | 国产手机精品视频 | 日本不卡一区二区三区在线观看 | 国内精品视频免费 | 五月婷婷综合在线观看 | 亚洲开心色 | 黄色精品视频 | 久草a在线| 国产日韩精品一区二区三区 | 欧美日韩在线视频一区二区 | 91av在线免费播放 | 91丨九色丨蝌蚪丰满 | 狠狠狠色丁香综合久久天下网 | 中文字幕免费在线看 | 免费中文字幕视频 | 视频在线观看亚洲 | 久久综合久久综合这里只有精品 | 欧美了一区在线观看 | 午夜av免费在线观看 | 国产免费成人av | 91精品秘密在线观看 | 黄色网址在线播放 | 日韩在线观看三区 | 国产xxxx做受性欧美88 | 色午夜影院 | 免费日韩 精品中文字幕视频在线 | 夜夜骑日日 | 国产福利小视频在线 | 91麻豆网 | 色视频网站免费观看 | 国产视频97 | av天天在线观看 | 久久一久久 | 国产色久| 五月婷婷在线观看视频 | 国产日韩av在线 | 少妇bbb好爽 | 国产精品18久久久久vr手机版特色 | 久久不射影院 | 99视频在线播放 | 2019中文最近的2019中文在线 | 国产精品一区二区精品视频免费看 | 婷婷久久久 | 久久久www成人免费精品张筱雨 | 国产一级久久 | 亚洲一区二区三区在线看 | 麻花豆传媒一二三产区 | 麻豆va一区二区三区久久浪 | 日韩a级黄色 | 天天爱天天操 | 国产护士hd高朝护士1 | 1000部18岁以下禁看视频 | 国产免费三级在线观看 | 粉嫩av一区二区三区免费 | 精品字幕 | 欧美性视频网站 | 国产精品中文字幕在线观看 | aⅴ精品av导航| 国产高清专区 | 国产精品高清av | 久久久精品 一区二区三区 国产99视频在线观看 | 在线亚洲午夜片av大片 | 亚洲电影av在线 | 日韩欧美国产免费播放 | 国产在线色 | 9999在线观看 | 免费观看www小视频的软件 | 久久精品视频中文字幕 | 欧美xxxx性xxxxx高清 | 大胆欧美gogo免费视频一二区 | 国产精品一区二区久久 | 亚洲综合日韩在线 | 日韩精品一区二区免费 | www.黄色在线| 欧美一级高清片 | 久久人视频 | 欧美人人爱 | 国产欧美综合在线观看 | 国产va在线 | 成年人电影免费看 | 中文字幕成人 | 午夜精品视频一区二区三区在线看 | 国产高清在线观看 | 国产精品观看视频 | 日韩,中文字幕 | 欧美精品久久久久久久久老牛影院 | 天天天干天天射天天天操 | 国产成人精品一区二区三区在线观看 | 亚洲综合激情网 | 免费黄色网址网站 | 久久久久久久精 | 中文字幕乱在线伦视频中文字幕乱码在线 | 日韩成人免费观看 | 91色一区二区三区 | 国产视频久 | 午夜视频一区二区 | 亚洲第一成网站 | 91视频最新网址 | 国产成人久久精品 | 亚洲国内精品在线 | 久久久毛片 | 91九色精品女同系列 | 欧美日本三级 | 人人干在线观看 | 国产在线高清视频 | 草久热 | 91精品国产综合久久福利 | 免费在线观看国产黄 | 欧美日韩国内在线 | 91久久爱热色涩涩 | 久草在线资源免费 | 欧美成人按摩 | 国产精品一级视频 | 亚洲国产成人久久综合 | 天堂网一区 | 99精品视频网 | 婷婷综合久久 | 婷婷亚洲综合五月天小说 | 国产成人亚洲在线观看 | 蜜臀91丨九色丨蝌蚪老版 | 国产在线999 | 精品国产网址 | 人人澡人人爽 | 久久精品成人 | 天天干视频在线 | 色婷婷在线视频 | 最新日韩在线 | 亚洲国产操 | 免费观看版| 国产97在线观看 | 国产99久久九九精品免费 | 日韩精品高清视频 | av福利资源 | 国产色妞影院wwwxxx | 91传媒91久久久 | 黄色视屏在线免费观看 | 久久国语| 亚洲精品色婷婷 | 国产品久精国精产拍 | 在线免费视 | 国产精久久久久久久 | 国产视频1 | 超碰com| 欧美成人按摩 | 国产99久久久国产精品免费二区 | 色wwww| 亚洲一区视频免费观看 | 五月天久久激情 | 国产丝袜高跟 | 2020天天干夜夜爽 | 亚洲免费国产 | 91成人免费看片 | 福利视频一区二区 | 99久久精品免费看国产 | 亚洲视频网站在线观看 | 国产精品原创在线 | 五月婷婷视频在线 | 亚洲国产免费看 | 亚洲欧美成人在线 | 成人一区二区三区中文字幕 | 欧美一级免费 | 免费一级片久久 | 在线观看黄网 | 狠狠的操狠狠的干 | 精品成人a区在线观看 | 日韩久久激情 | 日韩久久精品一区二区三区下载 | 国产精品18毛片一区二区 | 国产精品乱看 | 日韩在线激情 | 91正在播放 | 欧美一级视频免费 | 99精品国产兔费观看久久99 | 亚洲理论电影网 | 亚洲国产电影在线观看 | 美女在线观看网站 | 中文字幕视频网站 | 九九精品视频在线 | 国产精品美女久久久久久久久久久 | 国产黄色片久久久 | 国产精品人人做人人爽人人添 | 99热超碰在线 | 91精品爽啪蜜夜国产在线播放 | 国产精品久久久久久久久久东京 | www.com在线观看 | 99久久精品国产一区 | 91香蕉视频色版 | 国产精品高清在线观看 | 狠狠躁18三区二区一区ai明星 | 国产中文a | 二区三区在线观看 | 国产剧情久久 | 日韩精品一区二区三区在线播放 | 人人爽人人片 | 久久免费视频这里只有精品 | 91精品成人久久 | 国产精品黄色影片导航在线观看 | 亚洲一区二区视频在线播放 | 国产福利一区二区在线 | 欧美污网站 | 中国老女人日b | 日韩a级黄色片 | 午夜视频99| 午夜精品一区二区三区免费 | av成人免费在线观看 | 成片人卡1卡2卡3手机免费看 | 国产精品涩涩屋www在线观看 | 久久免费a | 三级av免费观看 | 久久福利国产 | 色综合天天色 | 日韩a在线| 九九免费在线观看 | 精品高清美女精品国产区 | 69精品视频在线观看 | 99精品国产一区二区三区麻豆 | 亚洲免费av一区二区 | 久久久久久久久久久久影院 | 美女国内精品自产拍在线播放 | av大全免费在线观看 | 国产视频二| 国产色综合天天综合网 | 成人黄色片免费 | 91成人在线观看高潮 | 黄色一级大片在线免费看产 | 久久一区二区三区四区 | 国产美女视频一区 | 四月婷婷在线观看 | av网站在线观看免费 | 久久久国产毛片 | 日本黄区免费视频观看 | 天天操天天摸天天射 | 国产成人一区二区三区在线观看 | 999热视频| 国产自在线观看 | 亚洲永久国产精品 | www激情com | 91一区啪爱嗯打偷拍欧美 | 国内外成人在线 | 精品欧美小视频在线观看 | 91麻豆免费看| av一区二区三区在线 | 亚洲婷婷免费 | 欧美日韩精品电影 | 国产免费一区二区三区最新 | 日韩试看| 国产91学生粉嫩喷水 | 性色av免费看 | 国产原创在线视频 | 久草在线观看 | 国产日本亚洲高清 | 黄色国产大片 | 美女av免费看 | 亚洲狠狠操 | 亚洲综合色视频在线观看 | 国产一区二区在线播放视频 |