溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

shell 之 sed 命令(七)

發(fā)布時間:2020-06-25 22:23:10 來源:網(wǎng)絡 閱讀:4968 作者:上帝之子521 欄目:開發(fā)技術

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

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

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

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

        打印 Jason 所在行,如下

shell 之 sed 命令(七)

        打印 Jason 至 Jane 所在的行

shell 之 sed 命令(七)

        打印以 103 開頭的行

shell 之 sed 命令(七)

        打印以 Manager 結尾的行

shell 之 sed 命令(七)

        以數(shù)字開頭,而且是連續(xù)重復三次

shell 之 sed 命令(七)

        每隔一行打印一次

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

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

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

        我們看到先打印了 Jason 行,接著輸出了 Jane 行。那么它是在里面怎么執(zhí)行的呢?先是尋找 Jane 行,找到第五行然后執(zhí)行,接著循環(huán)執(zhí)行到 Jason 行,再接著輸出。

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

        下來我們基于上面創(chuàng)建的文本內容進行演示說明。

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

shell 之 sed 命令(七) 

            b> 把第二行至第五行的 Manager 替換成 guozi
shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

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

shell 之 sed 命令(七)

            b> 數(shù)字標志 1,2,3

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

shell 之 sed 命令(七)

            c> p(print)標志

shell 之 sed 命令(七)

            d> 寫標志 w(write)

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

shell 之 sed 命令(七)

            e> 敏感標志 i(ignore flag)

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

shell 之 sed 命令(七)

            我們看到在前面沒加 i 之前,它是沒進行替換的。但是在加上 i 之后,它已經(jīng)替換了。

            f> 聯(lián)合使用標志

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

shell 之 sed 命令(七)

        3、替換命令定界符

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

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

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

shell 之 sed 命令(七)

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

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

        origin-string 替換到 replace-string 當中
shell 之 sed 命令(七)

        我們看到將 John 字符串直接加上 [ ]。需求:將開頭為三位數(shù)字的外面再加一層{ }
shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

        a> 截取網(wǎng)卡 IP 的地址

        解法一:使用 cut 命令

shell 之 sed 命令(七)

        我們使用 grep 進行 inet addr 的查找,查找到信息后,再使用 cut 命令進行截斷。我們來 man cut,看看 cut 命令的 -d 和 -f 選項是什么意思shell 之 sed 命令(七)

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

        解法二:sed 命令

shell 之 sed 命令(七)

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

        b> 去除注釋和空行

shell 之 sed 命令(七)

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

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

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

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

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

shell 之 sed 命令(七)

        b> 在文本最后追加一行

shell 之 sed 命令(七)

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

shell 之 sed 命令(七)

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

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

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

shell 之 sed 命令(七)

        3、使用 c 命令修改行

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

shell 之 sed 命令(七)

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

            格式:sed -n l input-file

shell 之 sed 命令(七)

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

        5、使用 = 命令打印行號

            格式:sed = input-file

shell 之 sed 命令(七)

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

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

shell 之 sed 命令(七)

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

        7、使用 q 命令終止執(zhí)行

            示例:sed '3 q' input-file 執(zhí)行完第3行后終止

            sed '/Anand/ q' input-file匹配到 Anand 行后退出
shell 之 sed 命令(七)

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI