您好,登錄后才能下訂單哦!
今天我們來學習下 shell 腳本中的 sed 命令。首先我們來看看 sed 的工作流程,它可以分為以下幾步:
我們看到先是讀入到一個模式空間中,然后再進行輸出。下來我們來看看 sed 命令的基本語法,它的命令格式為:sed [options] {sed-commands} {input-file};我們來看看
我們看到在我們用 sed 命令之后,輸出了兩遍它的內容。一個便是 example.txt 的內容,另一個是模式空間的內容。
下來我們來看看 sed 命令的 -n 選項(--quit --silent);上面的 p 命令是指 print。我們要是想只輸出一遍內容,那么我們就得加 -n 選項了。我們在前面的 makefile 中學習過,-n 選項就和之前的靜默執(zhí)行的效果是一樣的。我們只打印第一行,看看效果
我們看到是輸出了這個效果。下來我們來看看如果想打印第一行至第三行的內容呢
打印 Jason 所在行,如下
打印 Jason 至 Jane 所在的行
打印以 103 開頭的行
打印以 Manager 結尾的行
以數(shù)字開頭,而且是連續(xù)重復三次
每隔一行打印一次
我們看到 sed 命令的 -n 選項如上所示。下來我們來看看 sed 的 d 命令(delete),刪除 103 字符串所在的行,sed '/103/ d' example.txt
我們看到在 sed 命令中就刪除了 103 行的內容,而在 example.txt 中也還是全部在,由此我們可以看出,sed 命令的模式空間確實是存在的。
下面我們來看看更多的 sed 選項,-f 從文件中讀入命令。新建 cmd.sed 命令文件,文件內容如下:/Jane/ p
我們看到 105 行 Jane 內容生成了兩行。那么我們可以在命令文件中寫多個命令,-e 選項執(zhí)行多個命令,我們來打印 Jason 和 Jane 所在的行
我們看到先打印了 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 字符串
b> 把第二行至第五行的 Manager 替換成 guozi
c> 把 John 所以字符串行當中的 CEO 替換成 XXX
d> 從第四行而且包含字符串 Ram 的行中,把 Developer 字符串替換成 XXX
e> 如果沒有 address-range 和 pattern-range,那么就會把每一行碰到的第一個匹配字符串給替換掉
我們看到只替換了第一個 1,而 101 中的后面的一個1 并沒有替換掉,我們接著往下學習。
2、substitute-flags
a> 全局標志 g(globe)
全局標志會把遇到的所有的滿足條件的字符串給替換掉
b> 數(shù)字標志 1,2,3
把要匹配串中的第 2 個符合條件的匹配串替換成我們想要的字符串
c> p(print)標志
d> 寫標志 w(write)
把每一行碰到第一個字符串 John 替換成 guozi 字符串,并寫入 output.txt 中
e> 敏感標志 i(ignore flag)
忽略大小寫,把文本當中所有包含 jason 字符串的行替換成 AAAA 字符串
我們看到在前面沒加 i 之前,它是沒進行替換的。但是在加上 i 之后,它已經(jīng)替換了。
f> 聯(lián)合使用標志
可以使用多個標志來對字符串進行替換并保存
3、替換命令定界符
格式 1:sed ‘s///’ example.txt
格式 2:sed ‘s@@@’ example.txt
用處:使用合理的定界符可以方便的閱讀我們的程序代碼。
我們看到在使用三種符號的效果是一樣的,在有時有路徑的情況下,用 @ 符號看起來比較好。
4、強大的& -- 樣式匹配
將 origin-string 替換到 replace-string 當中
我們看到將 John 字符串直接加上 [ ]。需求:將開頭為三位數(shù)字的外面再加一層{ }
我們看到直接在三個數(shù)字外面加上 { }。下來我們來看看一個選項 i,它是什么作用呢?它的作用是直接替換文本內容,如下
我們看到 example.txt 的文本內容是直接被替換了。那么我們下面有個需求:將上面文本的前三位數(shù)截取出來,并加上大括號,去掉后面的全部內容,如下
解法一:sed 's/\(^[0-9]*\),.*/{\1}/g' example.txt,以數(shù)字開頭,然后將后面的全部替換為空,再用標簽 1 來進行 { } 的替換
解法二:sed 's/\([^,]*\).*/{\1}/g' example.txt,以逗號開頭,然后將后面的全部替換為空,再用標簽 1 來進行 { } 的替換
我們再來看看 sed 其他示例的講解
a> 截取網(wǎng)卡 IP 的地址
解法一:使用 cut 命令
我們使用 grep 進行 inet addr 的查找,查找到信息后,再使用 cut 命令進行截斷。我們來 man cut,看看 cut 命令的 -d 和 -f 選項是什么意思
我們在命令中使用 -d 來將冒號和空格替換為空,再用 -f 選項來保留第一段或者是第二段內容。
解法二:sed 命令
我們看到有三種寫法,第一種是利用了 -e 可以將多個 sed 命令聯(lián)合起來使用;第二種是以非數(shù)字開頭的將它替換為空,再將以數(shù)字開頭的后面全部去除掉;第三種則是替換數(shù)字前面,再找尋三段數(shù)字,最后將后面全部替換為空。
b> 去除注釋和空行
我們將 /etc/network/interfaces 拷貝至當前目錄下,再將它里面的注釋和空行全部刪除掉。先是利用以 # 開頭的全部替換為空,再以空格結尾的進行全部刪除,因此達到最后的要求。效果如最后 cat 所示。
我們下來看看附加的 sed 命令。
1、使用 a 命令追加行(append)
格式:sed '[address] a the-line-to-append' input-file
示例:a> 在文本的第 2 行后追加一行
b> 在文本最后追加一行
c> 在文本匹配處增加多行
2、使用 i 命令插入行(insert)
格式:sed '[address] i the-line-to-insert' input-file
用法跟 a 命令類似,不同的是匹配地址所有行之前
3、使用 c 命令修改行
格式:sed '[address] c the-line-to-insert' input-file
4、使用 l 命令打印隱藏字符
格式:sed -n l input-file
我們看到在加 l 選項后,\t 和結尾符 $ 都打印出來了。
5、使用 = 命令打印行號
格式:sed = input-file
6、使用 y 命令作字符轉換
格式: sed 'y/original-string/replace-string/' input-file
我們看到 y 選項是用于將 abced 這幾個字符轉換為 ABCDE。它的用途是:用于加密字符串
7、使用 q 命令終止執(zhí)行
示例:sed '3 q' input-file 執(zhí)行完第3行后終止
sed '/Anand/ q' input-file匹配到 Anand 行后退出
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。