一.介紹
sed是一個流編輯工具,可以用來實現對文本的過濾與替換,而Linux的哲學思想之一就是一切皆文件,因此對文本的操作至關重要。sed的基本工作原理是通過每次讀取一行文本來來對默寫符合條件的文本進行處理。要注意的是sed默認并不直接修改源文件,而是將讀取到的內容復制到緩沖區在中,這個緩沖區也叫做模式空間,然后在模式空間中對文本進行處理,處理完成后將結果輸送到標磚輸出。
二.sed的使用
1.使用格式:
sed [options] {script} [file] |
常用的選項:
–help:獲取幫助 |
-n,–quiet:使用靜默模式,可以屏蔽自動打印功能 |
-e <script>:指定sed腳本 |
-f <file>:從指定的文件中獲取指令 |
-i:直接對源文件進行處理 |
-r:在腳本中使用正則表達式 |
2.sed中的操作地址定界
number:指定要對哪個行進行處理 |
start~step:指定其實位置和步長,例如偶數行:2~2 |
/pattern/:pattern為正則表達式指定的模式 |
addr1,addr2:從addr1到addr2之間的所有行 |
addr1,+number:從addr1開始之后的number行 |
$:最后一行 |
add1,/pattern/:從addr1開始到pattern之間的所有行 |
3.sed中常用的指令
a:追加 | s:替換 |
d:刪除 | i:插入 |
c:修改 | p:打印 |
w:保存至指定文件中 | !:條件取反 |
三.使用示例
測試文本為fstab
-
在第三行后面追加'hello'
sed '3a hello' fstab |
2.在第三行之前插入'hello world'
sed '3i hello world' fstab |
3.將所有#開頭的行刪除
sed '/^#/d' fstab |
4.在所有以#開頭的行后面添加新行'hello'
sed '/^#/a hello' fstab |
5.刪除所有空白行
sed '/^$/d' fstab |
6.打印奇數行
sed -n '1~2p'fstab |
7.將UUID修改為uuid
sed '/UUID/c uuid' fstab |
四.sed腳本
當sed指令較長時,就可以將其寫到一個文件中,sed腳本的基本格式是:
address{ command1 command2 } |
執行腳本時:sed -f script source_file
-
使用示例:
找到文本中每行的第二個test,并將其該為test2
/test/{ s//test2/2 } |
2.給所有的文本中所有的test添加“”
/test/{ s//"&"/g } |
3.讀取多個文件
/.*/{ $r 1.sh } |
五.sed的高級應用
在一般情況下,sed處理的文本都是在一個叫做模式空間的緩沖區中,sed在執行命令時,這個空間就是用來保存待處理的文本,但sed還有另一個緩沖區域,這個區域叫做保持空間,當sed處理模式空間中的某些行時,可以用保持空間來臨時存放一些行。sed的一些高級應用會涉及到保持空間。
1.next命令
n命令會移動到數據流的下一行。
例如:(1)在文本中找到hello所在的行,并將其后面的空白行刪除
sed '/hello/{ n;d}' test |
(2)打印偶數行
sed -n 'n;p' test |
N命令會下一行添加到模式空間中已經存在的行的后面,
例如:(1)將hello所在行的后面一行合并到hello所在行
sed '/hello/{N;s/\n/ /}' test |
(2)替換出現在相連行中的文本,例如替換下面文本中test1 file為test file:
this is a test1 file , name is test |
sed 'N;s/test1\nfile/test\nfile/' test |
但是替換之后原本的兩行內容會被合并成一行,于是解決辦法就是使用兩個替換命令來處理
sed 'N;s/test1\nfile/test\nfile/;s/test1 file/test file/' test |
(有點難懂,多體會體會)
2.多行刪除
D:只刪除模式空間中的第一行
例如:當文本中有多個空白行,現在只刪除第一個空白行,對于下面的文本,刪除第一個空白行
this is a test1 file , name is test |
sed '/^$/;{N;/this/D}' test |
3.關于保持空間中使用的命令
h:將模式空間中的內容復制到保持空間中 |
H: 把模式空間中的內容追加至保持空間中 |
g: 把保持空間中的內容復制到模式空間 |
G: 把保持空間中內容追加到模式空間中 |
x: 交換保持空間和模式空間中的內容 |
使用示例:將相連的兩行調換位置
sed -n '{h;n;p;g;p}' test |
解釋:當第一行被加載到模式空間之中,h將這一行復制到保持空間,n會跳過這一行,打印下一行,然后g命令又會將第一行復制回來,然后打印,這樣,相連的兩行就會被調換順序。
4.排除命令(!)
即排除符合條件的文本,例如不答應包含hello的行
sed '/hello/!p' test |
逆序打印文本:
sed -n '{1!G;h;$p}' test |
解釋:當第一行被載入模式空間之后,h命令會把這一行復制到保持空間,知道模式空間中遇到最后一行才打印,當到最后一行時,保持空間中的順序是4321,于是再將保持空間中的內容打印就是逆序輸出了。
5.替換符號&
&可以用來引用替換命令中所匹配到的內容
例如:將文本中的hello都加上一個引號,注意這里的&替換的是整個模式匹配到的內容,不僅僅是一個單詞,只是本例中恰好一個單詞而已。
sed 's/hello/"&"/' test |
6.替換單獨的單詞
可以使用圓括號()來定義替換模式中的子模式
例如:文本中有多個world,現在只需替換文本中hello world中的world為girl
sed 's/\(hello\) \(world\)/\1 girl/' test |
這個使用方法十分詭異,我的理解是文本被載入到模式空間之后,原本的順序會被顛倒。
7.加倍行距
例如:在每個文本的每個行后面添加一個空白行
sed 'G' test |
解釋:因為保持空間只有一個空白行,所以每次模式空間操作完成之后,G會把保持空間中的空白行復制到模式空間,于是再次打印就會在原文件的每個行后面添加一個空白行。
8.給文件中的行編號
sed '=' test | sed 'N;s/\n/ /' |
常用的也就這些,關于sed的高級用法,會有些難以理解,如有理解錯誤的地方,請給予指正。
原創文章,作者:zhangbao,如若轉載,請注明出處:http://www.www58058.com/65829