sed 入門到提高

聲明: 以下所有的操作, 博主本人均在阿里雲(ubuntu 18.04)上驗證過, 可能不同的系統有些許差異, 還望大家學以致用。

本人能力有限,資歷尚淺,若有錯誤,請輕點拍磚,若有建議, 不勝感激!!!

目錄

工作原理

參數說明

動作說明

追加

基礎

提高

替換

基礎

刪除

基礎

提高

插入

打印

基礎

提高

替換

基礎

提高

1 .保留精確匹配到的部分, 替換其他部分:

2. &符號的使用

3. 需要匹配兩行或者多行的情況

讀入

寫入


工作原理

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

地址的指定方式如下:

  1. #,#
  2. /pattern1/,/pattern2/
  3. /pattern1/,+n
sed  '5,9d' a.txt 刪除第3到第9行
sed  '/aaa/,/bbb/da.txt 刪除匹配"aaa"的行到匹配"bbb"的行之間的行
sed  '/aaa/,+10da.txt 刪除包含"aaa"的行以及之後的10行(共計11行)
  • PS:

  1. $ 表示結尾, 也可以用來指定地址;
  2. 由於 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中

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