一.sed是啥
sed
(流編輯器,Stream Editor)是 Unix/Linux 系統中強大的文本處理工具,常用于對文本進行替換、刪除、插入、追加等操作。它逐行處理輸入文本,并根據提供的腳本命令修改文本,最后輸出結果。
二.基本操作
1.修改操作
(1)對整個文本進行修改
sed "s/-year/years" people.txt
?
(2)對文本指定行號進行修改
sed "2s/-year/years/" people.txt
(3)對2到5行進行修改
sed "2,5s/-year/years/" people.txt
?
(4)直接對原文進行修改加上-i
sed "2,5s/-year/years/" people.txt -i
(5)替換每一行中的所有的小寫 s 成大寫 S:
sed "s/s/S/g" people.txt
注意:g 的意思是一行中所有的匹配項,否則缺省只會匹配第一個 s
(6)替換每一行中的第 2 個小寫 s 成大寫 1:
sed "s/s/1/2" people.txt
?
(7)替換每一行中的第 2 個以后的小寫 s 成大寫 1:
sed "s/s/1/2g" people.txt
2.多個匹配
(1)將 "-year" 改成 "years",并且將第 3 行以后的最后一個任意字符去掉:
?
在?
sed
?命令里,3,$s/.$//
?是一段用于文本處理的規則,下面這就拆分成幾個部分,給你詳細講講每個符號的含義:1. 行范圍:
3,$
3
?代表第 3 行,$
?在?sed
?里是一個特殊符號,專門用來表示最后一行。- 把它們用?
,
?連起來?3,$
,整體的意思就是?“從第 3 行開始,一直到文件的最后一行”?。也就是說,下面的替換操作(s/.$//
)會作用在這個范圍內的每一行文本上。2. 替換語法:
s/原內容/新內容/
這是?
sed
?里最常用的替換操作格式,s
?就是 “substitute(替換)” 的意思,整個結構就是告訴?sed
?:找到 “原內容”,把它換成 “新內容” 。3. 匹配規則:
.$
.
?是正則表達式里的元字符,代表任意一個單個字符(像字母、數字、標點符號這些,除了換行符一般都能匹配)。$
?前面講過,是行尾的意思。把它們放一起?.$
?,就是說要匹配行末尾的那一個任意字符?。打個比方,要是一行文本是?abcde.
?,那這里的?.
(行末尾的那個點)就會被?.$
?匹配到;要是文本是?abcde
?,那最后一個字符?e
?會被匹配。4. 替換為空:
//
sed
?替換語法里,/
?是用來分隔 “原內容” 和 “新內容” 的。這里 “新內容” 的位置是空的(兩個?/
?緊挨著),意思就是把前面?.$
?匹配到的內容(行末尾最后一個字符 )替換成空字符串,說白了就是把行末尾最后一個字符刪掉 。
?注意:
*在單引號里面,元義字符可以直接使用,如果要去掉元義則要在前面加 \;在雙引號里面,sed 的命令要使用元義,則需要加 \,而命令的正則表達式要使用元義直接使用就行。
*在?
sed
?命令中,-e
?選項用于指定多個編輯命令,允許在一次?sed
?執行中組合多個操作。
(2)將 & 代替被匹配的變量:
sed -e "s/iS/[$]/" people.txt
將文本中每一行出現的第一個 is 的左右兩邊加上 [ ]
(3)在指定行的前面插入 (i) 或者后面插入 (a) 一些信息:
sed ’3i abcd’ people.txt 意思是 ==> 在第 3 行的前面插入 abcd
sed ’2a abcd’ people.txt 意思是 ==> 在第 2 行的后面插入 abcd
sed ’1,4a abcd’ people.txt 意思是 ==> 在第 1 至 4 行的后面分別插入 abcd
sed ’/US/a abcd’ people.txt 意思是 ==> 在匹配 US 的行的后面插入 abcd
(4)將指定的行替換成其他信息:
sed "2c ok" people.txt 意思是 ==> 將第 2 行替換成 ok
(5)將指定的行刪除掉:
sed ‘2d’ people.txt 意思是 ==> 將第 2 行給刪掉
sed ‘/US/d’ people.txt 意思是 ==> 將匹配 / US / 的所有行給刪掉
sed ’/<he>/d’ people.txt 意思是 ==> 將匹 配 he 的所有行給刪掉,注意:之所以要用 <> 將 he 給括起來,是因為不想匹配 she,當然,<> 需要轉義,寫成 <>
(6)打印指定匹配的行,用命令 p:
sed ’/Chen/p’ people.txt -n 意思是 ==> 打印匹配 Chen 的行
sed ’/Chen/, /Lau/p’ people.txt -n 意思是 ==> 打印匹配 Chen 或者 Lau 的行
sed ’3,/UK/p’ people.txt -n 意思是 ==> 從第 3 行開始打印,直到匹配 UK 為止
sed ’/UK/,6p’ people.txt -n 意思是 ==> 從匹配 UK 的行開始打印,直到第 6 行為止
3.總結:
3.5? ? ? ? 3代表開始5代表結束
&? ? ? ? ? ?代表he匹配的字符串
/A/? ? ? ? ? A為需要匹配的字符串
//? ? ? ? ? ? 清空
s/A/a/? ? ?替換
i? ? ? ? ? ? ? 前面插入
a? ? ? ? ? ? ?后面插入
d? ? ? ? ? ? ?刪除
p? ? ? ? ? ? ?打印
在正則表達式中? ? ? <>? ? ? ? |? ? ? ? {}? ? ? ? ()? ? ? ? +若是單引號不需要加上\,雙引號需要加上\