shell 之 sed 命令(七)

        今天我們來學習下 shell 腳本中的 sed 命令。首先我們來看看 sed 的工作流程,它可以分爲以下幾步:

圖片.png

        我們看到先是讀入到一個模式空間中,然後再進行輸出。下來我們來看看 sed 命令的基本語法,它的命令格式爲:sed [options] {sed-commands} {input-file};我們來看看

圖片.png

        我們看到在我們用 sed 命令之後,輸出了兩遍它的內容。一個便是 example.txt 的內容,另一個是模式空間的內容。

        下來我們來看看 sed 命令的 -n 選項--quit --silent);上面的 p 命令是指 print。我們要是想只輸出一遍內容,那麼我們就得加 -n 選項了。我們在前面的 makefile 中學習過,-n 選項就和之前的靜默執行的效果是一樣的。我們只打印第一行,看看效果

圖片.png

        我們看到是輸出了這個效果。下來我們來看看如果想打印第一行至第三行的內容呢

圖片.png

        打印 Jason 所在行,如下

圖片.png

        打印 Jason 至 Jane 所在的行

圖片.png

        打印以 103 開頭的行

圖片.png

        打印以 Manager 結尾的行

圖片.png

        以數字開頭,而且是連續重複三次

圖片.png

        每隔一行打印一次

圖片.png

        我們看到 sed 命令的 -n 選項如上所示。下來我們來看看 sed 的 d 命令(delete),刪除 103 字符串所在的行,sed '/103/   d' example.txt

圖片.png

        我們看到在 sed 命令中就刪除了 103 行的內容,而在 example.txt 中也還是全部在,由此我們可以看出,sed 命令的模式空間確實是存在的。

        下面我們來看看更多的 sed 選項,-f 從文件中讀入命令。新建 cmd.sed 命令文件,文件內容如下:/Jane/ p

圖片.png

        我們看到 105 行 Jane 內容生成了兩行。那麼我們可以在命令文件中寫多個命令,-e 選項執行多個命令,我們來打印 Jason 和 Jane 所在的行

圖片.png

        我們看到先打印了 Jason 行,接着輸出了 Jane 行。那麼它是在裏面怎麼執行的呢?先是尋找 Jane 行,找到第五行然後執行,接着循環執行到 Jason 行,再接着輸出。

        下來我們來看看替換命令的格式:sed '[address-range|pattern-range] s/originalstring/replacement-string/[substitute-flags]' inputfile
        我們來解釋下上面格式中的相關東西,address-range:地址列表,表示從哪個地方開始執行,如:1,3 表示第一行到第 3 行;pattern-range:樣式列表,表示從哪個樣式匹配串開始。如:/Jane/,表示從行中包含字符串 Jane 的行開始執行,[ ]中的都是可選的 ;s:表示要執行替換命令(substitute);originalstring:需要被替換的字符串 ;replacement-string:替換後的字符串;substitute-flags:可選替換標誌符。

        下來我們基於上面創建的文本內容進行演示說明。

        1、address-range 和 pattern-range
            a> 把第一行的 John 替換成 guozi 字符串

圖片.png 

            b> 把第二行至第五行的 Manager 替換成 guozi
圖片.png

            c> John 所以字符串行當中的 CEO 替換成 XXX

圖片.png

            d> 從第四行而且包含字符串 Ram 的行中,把 Developer 字符串替換成 XXX

圖片.png

            e> 如果沒有 address-range pattern-range,那麼就會把每一行碰到的第一個匹配字符串給替換掉

圖片.png

        我們看到只替換了第一個 1,而 101 中的後面的一個1 並沒有替換掉,我們接着往下學習。

        2、substitute-flags
            a> 全局標誌 g(globe)
            全局標誌會把遇到的所有的滿足條件的字符串給替換掉

圖片.png

            b> 數字標誌 1,2,3

            把要匹配串中的第 2 個符合條件的匹配串替換成我們想要的字符串

圖片.png

            c> p(print)標誌

圖片.png

            d> 寫標誌 w(write)

            把每一行碰到第一個字符串 John 替換成 guozi 字符串,並寫入 output.txt 中 

圖片.png

            e> 敏感標誌 i(ignore flag)

            忽略大小寫,把文本當中所有包含 jason 字符串的行替換成 AAAA 字符串

圖片.png

            我們看到在前面沒加 i 之前,它是沒進行替換的。但是在加上 i 之後,它已經替換了。

            f> 聯合使用標誌

            可以使用多個標誌來對字符串進行替換並保存

圖片.png

        3、替換命令定界符

        格式 1:sed ‘s///’ example.txt

        格式 2:sed ‘s@@@’ example.txt

        用處:使用合理的定界符可以方便的閱讀我們的程序代碼。

圖片.png

        我們看到在使用三種符號的效果是一樣的,在有時有路徑的情況下,用 @ 符號看起來比較好。

        4、強大的& -- 樣式匹配

        origin-string 替換到 replace-string 當中
圖片.png

        我們看到將 John 字符串直接加上 [ ]。需求:將開頭爲三位數字的外面再加一層{ }
圖片.png

        我們看到直接在三個數字外面加上 { }。下來我們來看看一個選項 i,它是什麼作用呢?它的作用是直接替換文本內容,如下

圖片.png

        我們看到 example.txt 的文本內容是直接被替換了。那麼我們下面有個需求:將上面文本的前三位數截取出來,並加上大括號,去掉後面的全部內容,如下

圖片.png

        解法一:sed 's/\(^[0-9]*\),.*/{\1}/g' example.txt,以數字開頭,然後將後面的全部替換爲空,再用標籤 1 來進行 { } 的替換

圖片.png

        解法二:sed 's/\([^,]*\).*/{\1}/g' example.txt,以逗號開頭,然後將後面的全部替換爲空,再用標籤 1 來進行 { } 的替換

圖片.png

        我們再來看看 sed 其他示例的講解

        a> 截取網卡 IP 的地址

        解法一:使用 cut 命令

圖片.png

        我們使用 grep 進行 inet addr 的查找,查找到信息後,再使用 cut 命令進行截斷。我們來 man cut,看看 cut 命令的 -d 和 -f 選項是什麼意思圖片.png

        我們在命令中使用 -d 來將冒號和空格替換爲空,再用 -f 選項來保留第一段或者是第二段內容。

        解法二:sed 命令

圖片.png

        我們看到有三種寫法,第一種是利用了 -e 可以將多個 sed 命令聯合起來使用;第二種是以非數字開頭的將它替換爲空,再將以數字開頭的後面全部去除掉;第三種則是替換數字前面,再找尋三段數字,最後將後面全部替換爲空。

        b> 去除註釋和空行

圖片.png

        我們將 /etc/network/interfaces 拷貝至當前目錄下,再將它裏面的註釋和空行全部刪除掉。先是利用以 # 開頭的全部替換爲空,再以空格結尾的進行全部刪除,因此達到最後的要求。效果如最後 cat 所示。

        我們下來看看附加的 sed 命令。

        1、使用 a 命令追加行(append)

            格式:sed '[address] a the-line-to-append' input-file

        示例:a> 在文本的第 2 行後追加一行

圖片.png

        b> 在文本最後追加一行

圖片.png

        c> 在文本匹配處增加多行

圖片.png

        2、使用 i 命令插入行(insert)

            格式:sed '[address] i the-line-to-insert' input-file

        用法跟 a 命令類似,不同的是匹配地址所有行之前

圖片.png

        3、使用 c 命令修改行

            格式:sed '[address] c the-line-to-insert' input-file

圖片.png

        4、使用 l 命令打印隱藏字符

            格式:sed -n l input-file

圖片.png

        我們看到在加 l 選項後,\t 和結尾符 $ 都打印出來了。

        5、使用 = 命令打印行號

            格式:sed = input-file

圖片.png

        6、使用 y 命令作字符轉換

            格式: sed 'y/original-string/replace-string/' input-file

圖片.png

        我們看到 y 選項是用於將 abced 這幾個字符轉換爲 ABCDE。它的用途是:用於加密字符串

        7、使用 q 命令終止執行

            示例:sed '3 q' input-file 執行完第3行後終止

            sed '/Anand/ q' input-file匹配到 Anand 行後退出
圖片.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章