聲明: 以下所有的操作, 博主本人均在阿里雲(ubuntu 18.04)上驗證過, 可能不同的系統有些許差異, 還望大家學以致用。
本人能力有限,資歷尚淺,若有錯誤,請輕點拍磚,若有建議, 不勝感激!!!
目錄
工作原理
sed讀取一行,首先將這行放入到緩存中然後,纔對這行進行處理處理完成以後,將緩衝區的內容發送到終端存儲sed讀取到的內容的緩存區空間稱之爲:模式空間
參數說明
-e | 以選項中指定的script來處理輸入的文本文件, 一個語句中可以指定多個腳本。exp: sed -n -e '3p' -e '7p' a.txt |
-f | 以選項中指定的script文件來處理輸入的文本文件 |
-h | 顯示幫助 |
-n | quiet(靜默)把處理之後的結果輸出, 方便check |
-V | 顯示版本信息 |
動作說明
追加
-
基礎
a :追加, a 的後面可以接字串(string1),string1 會成爲匹配行的下一行內容
exp:
sed '4a llll' a.txt | 在第四行之後追加一行, 內容爲llll |
sed '/b/a llll' a.txt(sed '/pattern/allll' a.txt) | 根據pattern匹配, 在匹配行之後追加一行, 內容爲llll |
-
提高
在匹配行之後的某一行插入一行內容:
sed '/aaa/{n;n;s/$/\nWORD/g}' a
替換
-
基礎
sed '2,5c kkkkk' a | 把2行和5行之間的所有內容 |
sed '/bbb/c kkkkk' a | 把匹配bbb的行都替換爲kkkkk |
注意:一定要區分s的替換, c的替換是整行的,而s是對字符串的替換
刪除
-
基礎
d :整行刪除,因爲是刪除,所以 d 後面通常不接任何咚咚.
基本格式是: sed '地址命令‘ a.txt
地址的指定方式如下:
- #,#
- /pattern1/,/pattern2/
- /pattern1/,+n
sed '5,9d ' a.txt |
刪除第3到第9行 |
sed '/aaa/,/bbb/d ' a.txt |
刪除匹配"aaa"的行到匹配"bbb"的行之間的行 |
sed '/aaa/,+10d ' a.txt |
刪除包含"aaa"的行以及之後的10行(共計11行) |
-
PS:
- $ 表示結尾, 也可以用來指定地址;
- 由於 sed '地址命令‘ a.txt, sed的執行腳本有兩部分組成, 如果你不指定地址, 根據sed行編輯的特性, 讀一行刪除一行, 整個文件都沒了;
-
提高
sed '/pattern/{n;d}' a.txt | 刪除匹配到行的下一行內容 |
sed -n '$!N;/\n.*aaa/!P;D' | 刪除匹配行的上一行內容 |
sed '/pattern/{p;:a;N;$!ba;d}' a.txt |
刪除匹配的下一行到最後一行 |
sed '5~2d' a.txt | 從第5行開始, 隔行刪除 |
sed '/aaa11/d;:go;1,X!{P;N;D};N;bgo' a | 刪除匹配行以及之前X行 |
插入
i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
PS:要注意i 和a 的差別, i是在指定(或者匹配)地址的位置插入, 把匹配到的行擠到下一行了, 但是a實在匹配到的行的下一行追加
sed '1,4ihahaha ' a.txt |
在文件第一行和第四行的每行下面新增一行, 內容爲hahaha |
打印
p :打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行
基礎
sed -n '3p ' a.txt |
打印第三行的內容 |
sed -n '1,3p ' a.txt |
打印第一行到第三行的內容 |
sed -n '/patern/p' a.txt | 打印匹配到patern 的所有行的內容 |
sed -n '/patern/=' a.txt | 打印匹配到patern 的所有行的行號 |
sed -n '/patern1/,/patern2/p ' a.txt |
打印patern1和patern2之間的所有行內容(包含這兩行) |
提高
sed -n '3p;7p' a.txt | 打印第三行和第七行, 等同於 sed -n -e '3p' -e '7p' a.txt |
sed -n -e '/pattern/{n;p}' a.txt | 打印匹配行的下一行 |
sed -n '/pattern/{x;p};h' a | 打印匹配行的上一行 |
sed -n -e '/pattern/{8,16p}' a | 把文本8到16行的內容中匹配到的行打出來 |
替換
-
基礎
s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!
可以先定位到行再替換:
-
提高
1 .保留精確匹配到的部分, 替換其他部分:
sed 's/\(kernel\.core_pattern=\).*/\1core/g' a.txt
sed 's/\(匹配項\)需要被替換項/\1core/g' a.txt ;\1 代表了括號匹配的內容
我們可以多次精準匹配, 並保留匹配到的結果
2. &符號的使用
sed 's/111e/hello_&/g' a.txt | & 符號在sed命令中代表上次匹配的結果 |
ps: 上面1的操作也可以用此方法實現, 但是&符號只有一個, 上面的卻可以有多個匹配保留項目
3. 需要匹配兩行或者多行的情況
sed '/aaa/{n;s/bbb/WORD&/g}' a
ps: 注意{裏面的n; 這個是下一行的意思, 如果是需要匹配到第一個,然後匹配他的第三行, 再加一個n;
sed '/aaa/{n;n;s/bbb/WORD&/g}' a
注意:以上兩種多行匹配, 替換的也只是最後一次匹配行的行內內容, 如上例,只能替換掉第三行,如果想替換兩次匹配之間的內容呢???
sed '/aaa/{N;N;s/111/WORD/g}' a
讀入
sed '/ccc/r b' a | 把文件b的內容追加到根據ccc匹配到的行後面 |
寫入
sed -n '/ccc/,/ddd/w b' a | 把ccc行和ddd行之間的所有內容, 輸入到文件b中 |