參考:
Linux文本三劍客超詳細教程---grep等龙、sed、awk - alonghub - 博客園 (cnblogs.com)
Linux三劍客(grep sed awk) 之 sed
linux命令總結sed命令詳解
sed
sed是對行處理的命令伶贰,要得到處理后的文件需要對處理后的文件進行重定向輸出蛛砰,可用來批量修改文本內(nèi)容
sed工作原理
sed把每一行存在臨時緩存區(qū),對該副本進行編輯黍衙,不會修改破壞源文件使用
1)格式
sed [options] '[地址定界] command' file(s)
2)常用options
- -n:不輸出模式空間內(nèi)容到屏幕泥畅,即不自動打印,只打印匹配到的行
- -e:多點編輯琅翻,命令順序會影響結果
- -f:把Script寫到文件當中位仁,在執(zhí)行sed時-f 指定文件路徑,如果是多個Script方椎,換行寫
- -r:支持擴展的正則表達式
- -i:直接將處理的結果寫入文件
- -i.bak:在將處理的結果寫入文件之前備份一份
3) 文本定位
image.png
4)正則表達式,必須結合-r選項
- ^:行首定位符 ,匹配所有以特定字符開頭的行
- $:行尾定位符聂抢,匹配所有以特定字符結尾的行
- .:匹配除換行外的單個字符
- *:匹配0或多個前導字符
- []:匹配指定字符組內(nèi)任一字符
- [^]:匹配不在指定字符組內(nèi)任一字符
- \(..\):保存已匹配的字符
- &:保存查找串以便在替換串中引用
- \<:詞首定位符
- \>:匹配包含以love結尾的單詞的行
- x\{m\}:連續(xù)m個x
- x\{m,\}:至少m個x
- x\{m,n\}:至少m個x,但不超過n個x
測試
$ cat sed.txt
love
lovexyz
loooove
xlovey
xylove
love
Aove
xxlove yy
looooooooooooooooooooove
looooooove
loooooooooooove
$ sed -n '/^love/p' sed.txt
love
lovexyz
$ sed -n '/love$/p' sed.txt
love
xylove
love
#匹配包含字符I棠众、后跟兩個任意字符琳疏、再跟字母e的行
$ sed -n '/l..e/p' sed.txt
love
lovexyz
xlovey
xylove
love
xxlove yy
#匹配在零個或多個空格緊跟著love的行
$ sed -n '/love*/p' sed.txt
love
lovexyz
xlovey
xylove
love
xxlove yy
$ sed -n '/xlovey*/p' sed.txt
xlovey
xxlove yy
#匹配包含love和Aove的行
$ sed -n '/[Al]ove/p' sed.txt
love
lovexyz
xlovey
xylove
love
Aove
xxlove yy
#匹配包含love且其前面的字符不在該區(qū)間內(nèi)字符的行
$ sed -n '/[^y-z]love/p' sed.txt
xlovey
love
xxlove yy
#&代表查找串,字符串love將替換前后各加了一個b的引用,即love變成bloveb
$ sed -n 's/love/b&b/p' sed.txt
bloveb
blovebxyz
xbloveby
xybloveb
bloveb
xxbloveb yy
#匹配包含以love開頭的單詞的行
$ sed -n '/\<love/p' sed.txt
love
lovexyz
love
#匹配包含以love結尾的單詞的行
$ sed -n '/love\>/p' sed.txt
love
xylove
love
xxlove yy
#匹配出現(xiàn)連續(xù)10個字母o的行
$ sed -n '/o\{10\}/p' sed.txt
looooooooooooooooooooove
loooooooooooove
#匹配至少5個連續(xù)字母o的行
$ sed -n '/o\{5,\}/p' sed.txt
looooooooooooooooooooove
looooooove
loooooooooooove
#匹配5~10個連續(xù)的o的行
$ sed -n '/o\{5,10\}/p' sed.txt
looooooooooooooooooooove
looooooove
loooooooooooove
5)操作命令
image.png
image.png
測試
#打涌张巍:p
$ sed -n '/love/p' sed.txt
#刪除:d
$ sed '3d' sed.txt
$ sed '3,$d' sed.txt #刪除3行~最后一行=保留第一二行
$ sed '/xlove/d' sed.txt #包含xlove的行均刪除
#替換:s
$ sed 's/love/hate/g' sed.txt #g表示全局替換疮薇,每行出現(xiàn)的所有l(wèi)ove都會被替換為hate;若無g我注,則只替換每行第一個love
$ sed -n 's/^love/hate/p' sed.txt #打印行首有l(wèi)ove并替換為hate的行
$ sed 's/love$/& you/' sed.txt #將匹配以love結尾的行的末尾加上you(&指查找串匹配到的內(nèi)容)
$ sed -n 's/xlove/hate/gp' sed.txt #將xlove全局替換為hate,并將匹配到的打印
$ sed 's/\(xlove\)y/\1hate/p' sed.txt #將xlove存儲迟隅,可以用\1來引用它但骨,則為xlovey替換為xlovehate
$ sed 's#xlove#b#g' sed.txt #s命令后的字符即為查找串和替換串之間的分隔符,適用于查找路徑名或生日時
#指定行的范圍:逗號
$ sed -n '/love/,/yy/p' sed.txt #打印love和yy之間所有的行
$ sed '/love/,/yy/s/$/**hate**/' sed.txt #修改從love到y(tǒng)y之間的所有行智袭,將各行行尾($)替換為字符串**hate**奔缠,換行符被移到新的字符串后面
#多重編輯:e
$ sed -e '1,3d' -e 's/love/hate/' sed.txt #先刪除1~3行,再將love替換為hate
#追加:a
$ sed '/^xlove/a I do' sed.txt #在行首包含xlove字符串的行后面追加一行I do吼野;若追加內(nèi)容多于一行校哎,則除最后一行外,其余都需要以\n結尾
#插入:i
$ sed '/xlove/i I do' sed.txt #在x包含xlove的行前面插入一行I do
#修改:c
$ sed '/xlove/c yhate' sed.txt #將xlove改為yhate
# 獲取下一行:n
$ sed '/xlove/{n;s/love/hate/;}' sed.txt #若匹配到xlove瞳步,就將下一行l(wèi)ove替換為hate
#轉換:y
$ sed '1,3y/love/LOVE/' sed.txt #將1~3行的l闷哆、o、v单起、e分別替換為L抱怔、O、V嘀倒、E
#退出:q
$ sed '5q' sed.txt #打印到第五行 sed程序就退出
$ sed '/xlove/{s/love/hate/;q;}' sed.txt #匹配到xlove時屈留,先將love替換為hate,然后q命令讓sed退出
6)字符集
- [:digit:]:所有數(shù)字测蘑,即[0-9]
- [:lower:]:所有小寫字母
- [:upper:]:所有大寫字母
- [:alpha:]:所有字母
- [:alnum:]:0-9灌危,a-z,A-Z
- [:space:]:空白字符
- [:punct:]:所有標點符號